Browse Source

代理订单审核功能

lazhaoqian 3 years ago
parent
commit
5368472877

+ 16 - 0
blade-service-api/blade-purchase-sales-api/src/main/java/org/springblade/purchase/sales/feign/IOrderCheckClient.java

@@ -30,4 +30,20 @@ public interface IOrderCheckClient {
 
 	@PostMapping("order/underSpecialReview")
 	R underSpecialReview(@RequestParam("id") Long id);
+
+	/**
+	 * 平台订单审核通过
+	 * @param id
+	 * @return
+	 */
+	@PostMapping("/agencyOrder/approve")
+	R approve(@RequestParam("id") Long id);
+
+	/**
+	 * 平台订单审核驳回
+	 * @param id
+	 * @return
+	 */
+	@PostMapping("/agencyOrder/reject")
+	R reject(@RequestParam("id") Long id);
 }

+ 18 - 1
blade-service-api/trade-purchase-api/src/main/java/com/trade/purchase/order/enums/OrderTypeEnum.java

@@ -75,9 +75,26 @@ public enum OrderTypeEnum {
 	/**
 	 * 经销商
 	 */
-	DEALER("JXS")
+	DEALER("JXS"),
 
+	/**
+	 * 录入
+	 */
+	ENTERING("录入"),
+	/**
+	 * 提交审批
+	 */
+	SUBMIT("提交审批"),
 
+	/**
+	 * 审批中
+	 */
+	APPROVE("审批中"),
+
+	/**
+	 * 审批通过
+	 */
+	PASS("审批通过"),
 
 	;
 

+ 5 - 4
blade-service/blade-check/src/main/java/org/springblade/check/controller/AuditProecessController.java

@@ -226,16 +226,17 @@ public class AuditProecessController extends BladeController {
 		else if ("xsgz".equals(proecess.getCheckType()) || "czgz".equals(proecess.getCheckType()) || "gzgz".equals(proecess.getCheckType()) || "hqgz".equals(proecess.getCheckType())) {
 			auditProecessService.salaryCheck(auditProecess);
 		}
+		//平台代理订单审核
+		else if ("dldd".equals(proecess.getCheckType())) {
+				auditProecessService.agencyOrderProcess(auditProecess);
+		}
 		// 办公用品采购
 		else if ("ocg".equals(proecess.getCheckType()) || "oly".equals(proecess.getCheckType())) {
 			auditProecessService.officeCheck(auditProecess);
 		} else {
 			auditProecessService.commonCheck(auditProecess);
 		}
-		//平台代理订单审核
-		if ("dldd".equals(proecess.getCheckType())) {
-			auditProecessService.agencyOrderProcess(auditProecess);
-		}
+
 		return R.data(auditProecess);
 	}
 

+ 9 - 10
blade-service/blade-check/src/main/java/org/springblade/check/service/impl/AuditProecessServiceImpl.java

@@ -1536,9 +1536,11 @@ public class AuditProecessServiceImpl extends ServiceImpl<AuditProecessMapper, A
 	}
 
 	@Override
+	@Transactional(rollbackFor = Exception.class)
+	@GlobalTransactional(rollbackFor = Exception.class,timeoutMills = 12000000)
 	public void agencyOrderProcess(AuditProecess auditProecess) {
 		//查看最新操作记录,防止重复提交
-		/*AuditProecess proecessTemp = baseMapper.selectById(auditProecess.getId());
+		AuditProecess proecessTemp = baseMapper.selectById(auditProecess.getId());
 		if (proecessTemp == null) {
 			throw new SecurityException("未查到此审批记录,禁止操作");
 		}
@@ -1579,10 +1581,7 @@ public class AuditProecessServiceImpl extends ServiceImpl<AuditProecessMapper, A
 			if (operate == 1) {
 				//如果是第一级, 则修改状态为审批中
 				if (auditProecess.getLevelId() == 1) {
-					Settlement settlement = new Settlement();
-					settlement.setId(auditProecess.getSrcBillId());
-					settlement.setCheckStatus("审批中");
-					R submit = financeClient.submit(settlement);
+					R submit = orderCheckClient.underReview(auditProecess.getSrcBillId());
 					if (!submit.isSuccess()) {
 						throw new SecurityException("审批开始修改审核状态失败");
 					}
@@ -1651,9 +1650,9 @@ public class AuditProecessServiceImpl extends ServiceImpl<AuditProecessMapper, A
 			else if (operate == 2) {
 				auditProecess.setAuditStatus("B");
 				//todo 调用feign取消
-				R r = financeClient.passCancel(auditProecess.getSrcBillId());
+				R r = orderCheckClient.reject(auditProecess.getSrcBillId());
 				if (!r.isSuccess()) {
-					throw new SecurityException("修改财务数据失败");
+					throw new SecurityException("修改订单数据失败");
 				}
 
 				sendMessage.setMessageBody("您的代理订单审核未通过" + ",代理订单号:" + proecessTemp.getBillNo() + ",驳回原因:" + auditProecess.getAuditMsg());
@@ -1670,7 +1669,7 @@ public class AuditProecessServiceImpl extends ServiceImpl<AuditProecessMapper, A
 			if (operate == 1) {
 				//todo 调用feign直接通过
 				auditProecess.setAuditStatus("A");
-				R r = financeClient.passCheck(auditProecess.getSrcBillId());
+				R r = orderCheckClient.approve(auditProecess.getSrcBillId());
 				if (!r.isSuccess()) {
 					throw new SecurityException("修改财务数据失败");
 				}
@@ -1685,7 +1684,7 @@ public class AuditProecessServiceImpl extends ServiceImpl<AuditProecessMapper, A
 			else if (operate == 2) {
 				//todo 调用feign取消
 				auditProecess.setAuditStatus("B");
-				R r = financeClient.passCancel(auditProecess.getSrcBillId());
+				R r = orderCheckClient.reject(auditProecess.getSrcBillId());
 				if (!r.isSuccess()) {
 					throw new SecurityException("修改财务数据失败");
 				}
@@ -1704,7 +1703,7 @@ public class AuditProecessServiceImpl extends ServiceImpl<AuditProecessMapper, A
 		//保存操作记录
 		auditProecess.setAuditMsg(auditProecess.getAuditMsg());
 		auditProecess.setAuditItem(new Date());
-		baseMapper.updateById(auditProecess);*/
+		baseMapper.updateById(auditProecess);
 	}
 
 	private void sendMsgToGroup(Message message, String group) {

+ 18 - 0
blade-service/blade-client/src/main/java/org/springblade/client/serial/mapper/SerialMapper.java

@@ -16,6 +16,8 @@
  */
 package org.springblade.client.serial.mapper;
 
+import com.baomidou.mybatisplus.annotation.SqlParser;
+import org.apache.ibatis.annotations.Param;
 import org.springblade.client.entity.Serial;
 import org.springblade.client.vo.SerialVO;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
@@ -39,4 +41,20 @@ public interface SerialMapper extends BaseMapper<Serial> {
 	 */
 	List<SerialVO> selectSerialPage(IPage page, SerialVO serial);
 
+	/**
+	 * 查询系统编号
+	 * @param billType 单据类型
+	 * @param tradeType  贸易类型(枚举:国内、进口、出口)
+	 * @param billPrefix 单据前缀
+	 * @param tenantId 租户id
+	 * @param serialType 模块类型
+	 * @return
+	 */
+	@SqlParser(filter=true)
+	Serial selectSerial(@Param("billType") String billType,
+						@Param("tradeType") String tradeType,
+						@Param("billPrefix") String billPrefix,
+						@Param("tenantId") String tenantId,
+						@Param("serialType") String serialType);
+
 }

+ 13 - 0
blade-service/blade-client/src/main/java/org/springblade/client/serial/mapper/SerialMapper.xml

@@ -25,5 +25,18 @@
     <select id="selectSerialPage" resultMap="serialResultMap">
         select * from basic_serial where is_deleted = 0
     </select>
+    <select id="selectSerial" resultMap="serialResultMap">
+        SELECT
+	        *
+        FROM
+	        basic_serial
+        WHERE
+	        is_deleted = 0
+	        AND bill_type = #{billType}
+	        AND bill_prefix = #{billPrefix}
+	        AND tenant_id = #{tenantId}
+	        AND trade_type = #{tradeType}
+	        AND serial_type = #{serialType}
+    </select>
 
 </mapper>

+ 1 - 1
blade-service/blade-client/src/main/java/org/springblade/client/serial/service/impl/SerialServiceImpl.java

@@ -121,7 +121,7 @@ public class SerialServiceImpl extends ServiceImpl<SerialMapper, Serial> impleme
 		billNoSerial.setTenantId(tenantId);
 		billNoSerial.setIsDeleted(0);
 		billNoSerial.setSerialType(serialType);
-		Serial serial = baseMapper.selectOne(new QueryWrapper<Serial>().setEntity(billNoSerial));
+		Serial serial = baseMapper.selectSerial(type,tradeType,yyyyMM,tenantId,serialType);
 		if (tradeType.equals("CK")){
 			yyyyMM = DateFormatUtils.format(date, "yyMMdd");
 			if (serial != null) {

+ 21 - 0
blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/controller/AgencyOrderController.java

@@ -8,6 +8,7 @@ import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import com.trade.purchase.order.enums.OrderTypeEnum;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
 import lombok.AllArgsConstructor;
 import org.springblade.client.entity.CorpsDesc;
 import org.springblade.client.feign.ICorpsDescClient;
@@ -203,4 +204,24 @@ public class AgencyOrderController extends BladeController {
 		order.setTradeType(OrderTypeEnum.DOMESTIC.getType());
 		return orderService.saveOrderMessage(order);
 	}
+	/**
+	 * 平台订单 审核通过
+	 */
+	@PostMapping("/approve")
+	@ApiOperationSupport(order = 8)
+	@ApiOperation(value = "Feign-审核通过", notes = "订单主表id")
+	public R approve(@ApiParam(value = "订单主表id", required = true) @RequestParam Long id) {
+		orderService.approve(id);
+		return R.success("操作成功");
+	}
+	/**
+	 * 平台订单审核不通过
+	 */
+	@PostMapping("/reject")
+	@ApiOperationSupport(order = 8)
+	@ApiOperation(value = "Feign-审核不通过", notes = "订单主表id")
+	public R reject(@ApiParam(value = "订单主表id", required = true) @RequestParam Long id) {
+		orderService.reject(id);
+		return R.success("操作成功");
+	}
 }

+ 12 - 0
blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/service/IOrderService.java

@@ -147,4 +147,16 @@ public interface IOrderService extends IService<Order> {
 	 * @return
 	 */
 	MonthSales monthSales(OrderVO Order);
+
+	/**
+	 * 平台订单审核通过
+	 * @param id
+	 */
+	void approve(Long id);
+
+	/**
+	 * 平台订单审核驳回
+	 * @param id
+	 */
+	void reject(Long id);
 }

+ 147 - 0
blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/service/impl/OrderServiceImpl.java

@@ -41,6 +41,7 @@ import org.springblade.common.utils.NumToWords;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.secure.utils.SecureUtil;
 import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.BeanUtil;
 import org.springblade.core.tool.utils.ObjectUtil;
 import org.springblade.finance.dto.ApplyDTO;
 import org.springblade.finance.feign.IFinanceClient;
@@ -1351,6 +1352,152 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
 		return monthSales;
 	}
 
+	@Override
+	public void approve(Long id) {
+		LambdaQueryWrapper<Order> orderLambdaQueryWrapper = new LambdaQueryWrapper<>();
+		orderLambdaQueryWrapper
+			.eq(Order::getId, id)
+			.eq(Order::getTenantId, AuthUtil.getTenantId());
+		Order order = baseMapper.selectOne(orderLambdaQueryWrapper);
+		if (order == null) {
+			throw new SecurityException("审批通过失败");
+		}
+		if (order.getStatus() == 3) {
+			throw new SecurityException("订单已审批通过请勿重复审批");
+		}
+		if (order.getGenerate() == 1){
+			throw new SecurityException("订单已生成销售订单请勿重复审批");
+		}
+		//修改采购合同信息
+		Order purchase = new Order();
+		purchase.setId(order.getSrcId());
+		purchase.setOrderStatus("平台审核通过");
+		baseMapper.updateById(purchase);
+		//生成平台销售订单
+		Order market = new Order();
+		BeanUtil.copy(order,market);
+		market.setId(null);//id置为空
+		market.setSrcId(order.getId());//来源id
+		market.setSrcOrderNo(order.getOrderNo());//来源单号
+		market.setCreateUser(SecureUtil.getUserId());
+		market.setCreateTime(new Date());
+		market.setUpdateTime(null);
+		market.setUpdateUser(null);
+		market.setOrderStatus(OrderStatusEnum.ENTERING.getType());//订单状态
+		market.setStatus(0);//订单状态
+		market.setGenerate(0);
+		market.setBillType(OrderTypeEnum.SALES.getType());//订单类型
+		market.setTradeType(OrderTypeEnum.DOMESTIC.getType());//贸易类型
+		// 获取系统编号
+		R billNo = serialClient.getBillNo(market.getBillType(), market.getTradeType(), market.getBillType());
+		if (billNo.getCode() != 200) {
+			throw new SecurityException("生成系统编号失败");
+		}
+		market.setSysNo(billNo.getData().toString());//系统编号
+		R<CorpsDesc> corpMessage = corpsDescClient.getCorpMessage(market.getCorpId());
+		if (corpMessage.isSuccess()) {
+			R clientBillNo = serialClient.getBillNo(corpMessage.getData().getCode(), market.getTradeType(), market.getBillType());
+			if (!clientBillNo.isSuccess()) {
+				throw new SecurityException("生成订单编号失败");
+			}
+			market.setOrderNo((String) clientBillNo.getData());//销售订单号
+			market.setOrgOrderNo((String) clientBillNo.getData());
+		}
+		//保存销售订单信息
+		baseMapper.insert(market);
+		//保存销售订单明细信息
+		LambdaQueryWrapper<OrderItems> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+		lambdaQueryWrapper.eq(OrderItems::getPid,order.getId());
+		lambdaQueryWrapper.eq(OrderItems::getIsDeleted,0);
+		lambdaQueryWrapper.eq(OrderItems::getTenantId,order.getTenantId());
+		List<OrderItems> orderItemsList = orderItemsMapper.selectList(lambdaQueryWrapper);
+		if (CollectionUtils.isNotEmpty(orderItemsList)){
+			orderItemsList.stream().forEach(item ->{
+				item.setId(null);
+				item.setStatus(0);
+				item.setPid(market.getId());
+				item.setCreateTime(new Date());
+				item.setCreateUser(SecureUtil.getUserId());
+				item.setUpdateUser(SecureUtil.getUserId());
+				item.setUpdateTime(new Date());
+				orderItemsMapper.insert(item);
+			});
+		}
+
+		// 生成毛利润 毛利额
+		List<OrderItems> list = orderItemsService.list(new QueryWrapper<OrderItems>().eq("pid", market.getId()).eq("good_type",0).eq("is_deleted", 0));
+		Order orderMessage = new Order();
+		orderMessage.setId(market.getId());
+		if (CollectionUtils.isNotEmpty(list)) {
+			// 采购金额求和
+			BigDecimal reduce = list.stream().reduce(BigDecimal.ZERO, (x, y) -> x.add(y.getPurchaseAmount().multiply(y.getOrderQuantity())), BigDecimal::add);
+			// 金额求和
+			BigDecimal amount = list.stream().map(OrderItems::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
+			//毛利额 = 销售金额-采购金额-预计海运费-本次使用返利+应收费用(除包装费)
+			BigDecimal grossProfit = amount.subtract(reduce.add(order.getPredictOceanFreight())).subtract(order.getCreateProfit() == null ? BigDecimal.ZERO : order.getCreateProfit());
+			//国内主表需要总重量总体积
+			//总重量求和
+			BigDecimal cntrVolumn = list.stream().reduce(BigDecimal.ZERO, (x, y) -> x.add(y.getCntrVolumn().multiply(y.getOrderQuantity())), BigDecimal::add);
+			//总体积求和
+			BigDecimal cartonWeight = list.stream().reduce(BigDecimal.ZERO, (x, y) -> x.add(y.getCartonWeight().multiply(y.getOrderQuantity())), BigDecimal::add);
+			// 毛利额添加应收费用(除包装费)
+			Long feeId = 0L;
+			R<FeesDesc> fees = feesDescClient.getFeesByName("包装费");
+			if (fees.isSuccess() && ObjectUtil.isNotEmpty(fees.getData())) {
+				feeId = fees.getData().getId();
+			}
+			List<OrderFees> feeList = orderFeesService.list(new LambdaQueryWrapper<OrderFees>().eq(OrderFees::getPid, order.getId()).ne(OrderFees::getItemId, feeId).eq(OrderFees::getIsDeleted, 0));
+			BigDecimal totalFee = feeList.stream().map(OrderFees::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
+			grossProfit = grossProfit.add(totalFee);
+
+			BigDecimal grossProfitRate = new BigDecimal(BigInteger.ZERO);
+			if (amount.compareTo(BigDecimal.ZERO) > 0) {
+				grossProfitRate = (grossProfit.divide(amount, RoundingMode.CEILING)).multiply(new BigDecimal(100));
+			}
+			// 毛利额
+			orderMessage.setGrossProfit(grossProfit);
+			// 毛利率
+			orderMessage.setGrossProfitRate(grossProfitRate);
+			//总重量
+			orderMessage.setCntrVolumn(cntrVolumn);
+			//总提价
+			orderMessage.setCartonWeight(cartonWeight);
+		}
+		baseMapper.updateById(orderMessage);
+		//修改代理订单信息
+		order.setStatus(3);
+		order.setGenerate(1);
+		order.setOrderStatus(OrderStatusEnum.PASS.getType());
+		baseMapper.updateById(order);
+
+	}
+
+	@Override
+	public void reject(Long id) {
+		LambdaQueryWrapper<Order> orderLambdaQueryWrapper = new LambdaQueryWrapper<>();
+		orderLambdaQueryWrapper
+			.eq(Order::getId, id)
+			.eq(Order::getTenantId, AuthUtil.getTenantId());
+		Order order = baseMapper.selectOne(orderLambdaQueryWrapper);
+		if (order == null) {
+			throw new SecurityException("未找到单据");
+		}
+		if (order.getStatus() == 0) {
+			throw new SecurityException("订单已驳回或未提交审批,请勿重复操作");
+		}
+		//修改代理订单信息
+		order.setStatus(0);
+		order.setIsDeleted(1);
+		order.setOrderStatus(OrderStatusEnum.ENTERING.getType());
+		baseMapper.updateById(order);
+		//修改采购合同信息
+		Order indent = new Order();
+		indent.setId(order.getSrcId());
+		indent.setOrderStatus("平台拒绝接单");
+		indent.setGenerate(0);//平台拒绝,代理商可以再次提交采购合同
+		baseMapper.updateById(indent);
+	}
+
 	/**
 	 * 转换金额为英文大写
 	 *

+ 3 - 5
blade-service/trade-purchase/src/main/java/com/trade/purchase/order/service/impl/PurchaseServiceImpl.java

@@ -4,7 +4,6 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.trade.purchase.office.service.IStockService;
 import com.trade.purchase.order.entity.Order;
 import com.trade.purchase.order.entity.OrderItems;
 import com.trade.purchase.order.enums.OrderTypeEnum;
@@ -28,7 +27,6 @@ import org.springblade.client.vo.GoodsDescVO;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.secure.utils.SecureUtil;
 import org.springblade.core.tool.api.R;
-import org.springblade.mocha.entity.SalesPolicyItem;
 import org.springblade.mocha.feign.ISalesPolicyClient;
 import org.springblade.mocha.vo.SalesPolicyItemVO;
 import org.springblade.stock.feign.IStockGoodsClient;
@@ -36,7 +34,6 @@ import org.springblade.system.entity.Tenant;
 import org.springblade.system.feign.ITenantClient;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
-import org.springframework.transaction.interceptor.TransactionAspectSupport;
 
 import java.math.BigDecimal;
 import java.util.*;
@@ -120,6 +117,7 @@ public class PurchaseServiceImpl extends ServiceImpl<OrderMapper, Order> impleme
 		CorpsDesc supplier = corpsDescList.get(0);//供应商/生成工厂
 		//生成平台代理商订单
 		Order purchase = new Order();
+		purchase.setBelongToCorpId(corpsDesc.getId());//所属公司
 		purchase.setBillType(order.getBillType());//代理订单
 		purchase.setTradeType(order.getTradeType());//国内订单
 		purchase.setTenantId(tenant.getTerrace());//代理商对应的平台的租户id
@@ -138,7 +136,8 @@ public class PurchaseServiceImpl extends ServiceImpl<OrderMapper, Order> impleme
 		purchase.setBanksAccountName(corpsDesc.getAccountName());//公司户头
 		purchase.setAccountBank(corpsDesc.getAccountBank());//开户银行
 		purchase.setShippingAddress(supplier.getStorageAddr());//发货地址
-		purchase.setStatus(1);
+		purchase.setStatus(1);//审批状态
+		purchase.setOrderStatus(OrderTypeEnum.SUBMIT.getType());
 		purchase.setArrivalAddress(agentCode.getStorageAddr());//到货地址
 		//生成系统编号
 		R billNo = serialClient.getNo(purchase.getBillType(), purchase.getTradeType(), purchase.getBillType(),tenant.getTerrace());
@@ -153,7 +152,6 @@ public class PurchaseServiceImpl extends ServiceImpl<OrderMapper, Order> impleme
 		}
 		purchase.setOrderNo((String) clientBillNo.getData());//销售单号
 		purchase.setMorderNo(order.getOrderNo());//主订单号
-		purchase.setOrderStatus("录入");
 		orderMapper.insert(purchase);
 		//生成平台代理商订单明细
 		if (CollectionUtils.isNotEmpty(orderItemsList)){