Browse Source

销售机会流程变更 2022年7月28日18点00分

纪新园 3 years ago
parent
commit
5760455d6d
25 changed files with 878 additions and 315 deletions
  1. 11 0
      blade-service-api/blade-client-api/src/main/java/org/springblade/client/feign/ICorpsDescClient.java
  2. 10 0
      blade-service-api/blade-client-api/src/main/java/org/springblade/client/feign/IGoodsDescClient.java
  3. 2 0
      blade-service-api/blade-project-api/src/main/java/org/springblade/project/entity/ServiceProject.java
  4. 12 0
      blade-service-api/blade-project-api/src/main/java/org/springblade/project/entity/ServiceProjectItem.java
  5. 24 0
      blade-service-api/trade-purchase-api/src/main/java/com/trade/purchase/extra/entity/Leads.java
  6. 15 1
      blade-service-api/trade-purchase-api/src/main/java/com/trade/purchase/extra/entity/LeadsItem.java
  7. 44 0
      blade-service-api/trade-purchase-api/src/main/java/com/trade/purchase/extra/feign/ILeadsClient.java
  8. 3 0
      blade-service/blade-check/src/main/java/org/springblade/check/controller/AuditProecessController.java
  9. 5 0
      blade-service/blade-check/src/main/java/org/springblade/check/service/IAuditProecessService.java
  10. 154 0
      blade-service/blade-check/src/main/java/org/springblade/check/service/impl/AuditProecessServiceImpl.java
  11. 27 14
      blade-service/blade-client/src/main/java/org/springblade/client/affairs/controller/AffairsController.java
  12. 11 0
      blade-service/blade-client/src/main/java/org/springblade/client/corps/feign/CorpsDescClient.java
  13. 11 0
      blade-service/blade-client/src/main/java/org/springblade/client/goods/feign/GoodsDescClient.java
  14. 1 0
      blade-service/blade-deliver-goods/src/main/java/org/springblade/deliver/goods/controller/ImportDeliveryController.java
  15. 4 0
      blade-service/blade-deliver-goods/src/main/java/org/springblade/deliver/goods/receiving/ImportReCeVingController.java
  16. 12 0
      blade-service/blade-project/src/main/java/org/springblade/project/controller/ProjectController.java
  17. 7 0
      blade-service/blade-project/src/main/java/org/springblade/project/service/ServiceProjectService.java
  18. 310 299
      blade-service/blade-project/src/main/java/org/springblade/project/service/impl/ServiceProjectServiceImpl.java
  19. 33 0
      blade-service/trade-purchase/src/main/java/com/trade/purchase/extra/controller/LeadsController.java
  20. 3 0
      blade-service/trade-purchase/src/main/java/com/trade/purchase/extra/mapper/LeadsItemMapper.xml
  21. 2 0
      blade-service/trade-purchase/src/main/java/com/trade/purchase/extra/mapper/LeadsMapper.xml
  22. 17 0
      blade-service/trade-purchase/src/main/java/com/trade/purchase/extra/service/ILeadsService.java
  23. 123 0
      blade-service/trade-purchase/src/main/java/com/trade/purchase/extra/service/impl/LeadsServiceImpl.java
  24. 36 0
      blade-service/trade-purchase/src/main/java/com/trade/purchase/feign/leadsClient.java
  25. 1 1
      blade-service/trade-purchase/src/main/java/com/trade/purchase/order/mapper/OrderItemsMapper.xml

+ 11 - 0
blade-service-api/blade-client-api/src/main/java/org/springblade/client/feign/ICorpsDescClient.java

@@ -43,6 +43,7 @@ public interface ICorpsDescClient {
 	String GET_CORP_ID = API_PREFIX + "getCorpId";
 	String GRT_CORPS_ADDR = API_PREFIX + "/getCorpsAddr";
 	String GRT_CORPS_BANK = API_PREFIX + "/getCorpsBank";
+	String INSERT_CORP = API_PREFIX + "/insertCorp";
 	@PostMapping(CORPS_UPDATE)
 	R corpsUpdate(@RequestBody CorpsDesc corpsDesc);
 
@@ -164,4 +165,14 @@ public interface ICorpsDescClient {
 	@GetMapping(GRT_CORPS_BANK)
 	List<CorpsBank> getCorpsBank(@RequestParam("pid") Long pid,
 								 @RequestParam("tenantId")String tenantId);
+
+
+	/**
+	 * 添加客户
+	 *
+	 * @param corpsDesc    客户信息
+	 * @return
+	 */
+	@GetMapping(INSERT_CORP)
+	R insertCorp(@RequestBody CorpsDesc corpsDesc);
 }

+ 10 - 0
blade-service-api/blade-client-api/src/main/java/org/springblade/client/feign/IGoodsDescClient.java

@@ -30,6 +30,7 @@ public interface IGoodsDescClient {
 	String GET_GOODS_REPORT = API_PREFIX + "/getGoodsReport";
 	String TERRAC_ECODE = API_PREFIX + "terraceCode";
 	String GET_TERRAC_ECODE = API_PREFIX + "getTerraceCode";
+	String GET_GOODS_DESC_DETIAL = API_PREFIX+ "getGoodsDescDetail";
 	/**
 	 * 获取商品信息
 	 *
@@ -137,4 +138,13 @@ public interface IGoodsDescClient {
 	 */
 	@GetMapping(GET_TERRAC_ECODE)
 	GoodsDesc getTerraceCode(@RequestParam("terraceCode") String terraceCode,@RequestParam("tenantId") String tenantId);
+
+	/**
+	 * 根据商品id获取商品信息
+	 *
+	 * @param Id  商品id
+	 * @return
+	 */
+	@GetMapping(GET_GOODS_DESC_DETIAL)
+	GoodsDesc getGoodsDescDetail(@RequestParam("Id") Long Id);
 }

+ 2 - 0
blade-service-api/blade-project-api/src/main/java/org/springblade/project/entity/ServiceProject.java

@@ -168,4 +168,6 @@ public class ServiceProject  implements Serializable {
 
 	@TableField(exist = false)
 	private BigDecimal total;
+
+
 }

+ 12 - 0
blade-service-api/blade-project-api/src/main/java/org/springblade/project/entity/ServiceProjectItem.java

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableLogic;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.models.auth.In;
 import lombok.Data;
 import org.springblade.core.tenant.mp.TenantEntity;
 import org.springframework.format.annotation.DateTimeFormat;
@@ -48,6 +49,8 @@ public class ServiceProjectItem extends TenantEntity implements Serializable {
 	private BigDecimal amount;
 	//频率
 	private String frequency;
+	//频率次数
+	private Integer second;
 	//提醒日
 	private Date reminderDay;
 	//税率
@@ -102,6 +105,9 @@ public class ServiceProjectItem extends TenantEntity implements Serializable {
 	@TableLogic
 	private Integer isDeleted;
 
+	//是否为任务分支(默认否N  是Y)
+	private String branch;
+
 
 
 	private String createUserName;
@@ -173,4 +179,10 @@ public class ServiceProjectItem extends TenantEntity implements Serializable {
 	private BigDecimal total;
 
 
+	/**
+	 * 任务状态
+	 */
+	private Integer taskStatus;
+
+
 }

+ 24 - 0
blade-service-api/trade-purchase-api/src/main/java/com/trade/purchase/extra/entity/Leads.java

@@ -135,6 +135,18 @@ public class Leads implements Serializable {
 	@ApiModelProperty(value = "是否已删除(0-否、1-是)")
 	private Integer isDeleted;
 
+	/**
+	 * 审批状态
+	 */
+	@ApiModelProperty(value = "审批状态")
+	private String approvalStatus;
+
+/**
+	 * 客户id
+	 */
+	@ApiModelProperty(value = "客户id")
+	private Long corpId;
+
 	@TableField(exist = false)
 	private List<LeadsItem> itemList;
 
@@ -150,4 +162,16 @@ public class Leads implements Serializable {
 	@TableField(exist = false)
 	private String toUserName;
 
+	@TableField(exist = false)
+	private String url;
+
+	@TableField(exist = false)
+	private String pageStatus;
+
+	@TableField(exist = false)
+	private String pageLabel;
+
+	@TableField(exist = false)
+	private String checkType;
+
 }

+ 15 - 1
blade-service-api/trade-purchase-api/src/main/java/com/trade/purchase/extra/entity/LeadsItem.java

@@ -26,7 +26,6 @@ import lombok.Data;
 import org.springframework.format.annotation.DateTimeFormat;
 
 import java.io.Serializable;
-import java.time.LocalDateTime;
 import java.util.Date;
 
 /**
@@ -145,4 +144,19 @@ public class LeadsItem implements Serializable {
 	@TableField(exist = false)
 	private String bizUserName;
 
+
+	@ApiModelProperty(value = "服务项目id")
+	private Long spId;
+
+	/**
+	 * 服务项目
+	 */
+	@ApiModelProperty(value = "服务项目")
+	private String serviceProjectName;
+	/**
+	 * 建议
+	 */
+	@ApiModelProperty(value = "建议")
+	private String chargeProposal;
+
 }

+ 44 - 0
blade-service-api/trade-purchase-api/src/main/java/com/trade/purchase/extra/feign/ILeadsClient.java

@@ -0,0 +1,44 @@
+package com.trade.purchase.extra.feign;
+
+import org.springblade.core.tool.api.R;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+/**
+ * @author caifc
+ * @date 2021-10-21 22:28
+ */
+@FeignClient(
+	value = "trade-purchase"
+)
+public interface ILeadsClient {
+
+	/**
+	 * 审核通过
+	 *
+	 * @param id
+	 * @return
+	 */
+	@PostMapping("/leadsPassCheck")
+	R leadsPassCheck(@RequestParam("id") Long id);
+
+	/**
+	 * 审核不通过
+	 *
+	 * @param id
+	 * @return
+	 */
+	@PostMapping("/leadsPassCancel")
+	R leadsPassCancel(@RequestParam("id") Long id);
+
+	/**
+	 * 审核中
+	 *
+	 * @param id
+	 * @return
+	 */
+	@PostMapping("/review")
+	R underReview(@RequestParam("id") Long id);
+
+}

+ 3 - 0
blade-service/blade-check/src/main/java/org/springblade/check/controller/AuditProecessController.java

@@ -238,6 +238,9 @@ public class AuditProecessController extends BladeController {
 		// 办公用品采购
 		else if ("ocg".equals(proecess.getCheckType()) || "oly".equals(proecess.getCheckType())) {
 			auditProecessService.officeCheck(auditProecess);
+		}// 销售机会审批
+		else if ("xsjh".equals(proecess.getCheckType())) {
+			auditProecessService.leadsCheck(auditProecess);
 		} else {
 			auditProecessService.commonCheck(auditProecess);
 		}

+ 5 - 0
blade-service/blade-check/src/main/java/org/springblade/check/service/IAuditProecessService.java

@@ -67,4 +67,9 @@ public interface IAuditProecessService extends IService<AuditProecess> {
 	 */
 	void agencyOrderProcess(AuditProecess auditProecess);
 
+	/**
+	 * 销售机会审批
+	 * @param auditProecess
+	 */
+	void leadsCheck(AuditProecess auditProecess);
 }

+ 154 - 0
blade-service/blade-check/src/main/java/org/springblade/check/service/impl/AuditProecessServiceImpl.java

@@ -22,6 +22,7 @@ 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.extra.feign.IClaimClient;
+import com.trade.purchase.extra.feign.ILeadsClient;
 import com.trade.purchase.office.feign.IOfficeOrderClient;
 import io.seata.spring.annotation.GlobalTransactional;
 import lombok.AllArgsConstructor;
@@ -98,6 +99,8 @@ public class AuditProecessServiceImpl extends ServiceImpl<AuditProecessMapper, A
 
 	private final IUserClient userClient;
 
+	private final ILeadsClient leadsClient;
+
 	@Override
 	public IPage<AuditProecessVO> selectAuditProecessPage(IPage<AuditProecessVO> page, AuditProecessVO auditProecess) {
 		return page.setRecords(baseMapper.selectAuditProecessPage(page, auditProecess));
@@ -1711,6 +1714,157 @@ public class AuditProecessServiceImpl extends ServiceImpl<AuditProecessMapper, A
 		baseMapper.updateById(auditProecess);
 	}
 
+	/**
+	 * 销售机会审批
+	 * @param auditProecess
+	 */
+	@Override
+	public void leadsCheck(AuditProecess auditProecess) {
+//查看最新操作记录,防止重复提交
+		AuditProecess proecessTemp = baseMapper.selectById(auditProecess.getId());
+		if (proecessTemp == null) {
+			throw new SecurityException("未查到此审批记录,禁止操作");
+		}
+		if ("A".equals(proecessTemp.getAuditStatus()) || "B".equals(proecessTemp.getAuditStatus())) {
+			throw new SecurityException("当前记录已经完成审批,禁止重复操作");
+		}
+
+		if (auditProecess.getAuditStatus() == null || !"S".equals(auditProecess.getAuditStatus())) {
+			throw new SecurityException("审批状态非待审,禁止操作");
+		}
+		//信息
+		Message sendMessage = new Message();
+		sendMessage.setParameter(String.valueOf(auditProecess.getBillId()));
+		sendMessage.setUserName(AuthUtil.getUserName());
+		sendMessage.setUserId(AuthUtil.getUserId());
+		sendMessage.setToUserId(auditProecess.getSendUserId());
+		sendMessage.setToUserName(auditProecess.getSendName());
+		sendMessage.setMessageType(1);
+		sendMessage.setTenantId(AuthUtil.getTenantId());
+		sendMessage.setCreateUser(AuthUtil.getUserId());
+		sendMessage.setCreateTime(new Date());
+		sendMessage.setUrl(auditProecess.getUrl());
+		sendMessage.setPageLabel(auditProecess.getPageLabel());
+		sendMessage.setPageStatus(auditProecess.getPageStatus());
+
+
+		//用户操作 1.通过  2.驳回
+		Integer operate = auditProecess.getOperate();
+		//查看当前审批是否为最后一级
+		String iffinalItem = auditProecess.getIffinalItem();
+		//审批人
+		auditProecess.setAuditUserId(String.valueOf(AuthUtil.getUserId()));
+		//审批时间
+		auditProecess.setAuditOpTime(new Date());
+		//不是最后一级
+		if ("F".equals(iffinalItem)) {
+
+			//通过
+			if (operate == 1) {
+				//如果是第一级, 则修改状态为审批中
+				if (auditProecess.getLevelId() == 1) {
+					R submit = leadsClient.leadsPassCheck(auditProecess.getSrcBillId());
+					if (!submit.isSuccess()) {
+						throw new SecurityException("审批开始修改审核状态失败");
+					}
+				}
+
+				auditProecess.setAuditStatus("A");
+				//查询下一级,开启待审
+				LambdaQueryWrapper<AuditProecess> auditProecessLambdaQueryWrapper = new LambdaQueryWrapper<>();
+				auditProecessLambdaQueryWrapper
+					.eq(AuditProecess::getBatchNo, auditProecess.getBatchNo())
+					.eq(AuditProecess::getSrcBillId, auditProecess.getSrcBillId())
+					.eq(AuditProecess::getIsDelete, 0)
+					.eq(AuditProecess::getActId, auditProecess.getActId())
+					.eq(AuditProecess::getBillId, auditProecess.getBillId())
+					.eq(AuditProecess::getBillNo, auditProecess.getBillNo())
+					.eq(AuditProecess::getTenantId, AuthUtil.getTenantId())
+					.eq(AuditProecess::getLevelId, auditProecess.getLevelId() + 1);
+				Integer count = baseMapper.selectCount(auditProecessLambdaQueryWrapper);
+				if (count != null && count > 1) {
+					throw new SecurityException("审核失败,获取下一级信息失败");
+				}
+				AuditProecess proecess = baseMapper.selectOne(auditProecessLambdaQueryWrapper);
+				if (proecess == null) {
+					throw new SecurityException("审批通过=>获取下一级信息失败");
+				}
+				proecess.setAuditStatus("S");
+				baseMapper.updateById(proecess);
+				Message message = new Message();
+				message.setParameter(String.valueOf(auditProecess.getBillId()));
+				message.setUserName(AuthUtil.getUserName());
+				message.setUserId(AuthUtil.getUserId());
+				message.setMessageType(1);
+				message.setTenantId(AuthUtil.getTenantId());
+				message.setMessageBody("你有新的审批待操作,请及时处理");
+				message.setCreateUser(AuthUtil.getUserId());
+				message.setUrl("/approveData/index");
+				message.setCreateTime(new Date());
+
+				// 消息批量通知下一级
+				sendMsgToGroup(message, proecess.getAuditUserId());
+			}
+			//不通过
+			else if (operate == 2) {
+				auditProecess.setAuditStatus("B");
+				//todo 调用feign取消
+				R r = leadsClient.leadsPassCancel(auditProecess.getSrcBillId());
+				if (!r.isSuccess()) {
+					throw new SecurityException("修改销售机会失败");
+				}
+
+				sendMessage.setMessageBody("您的请核未通过,驳回原因:" + auditProecess.getAuditMsg());
+				R save = messageClient.save(sendMessage);
+				if (!save.isSuccess()) {
+					throw new SecurityException("发送消息失败");
+				}
+			}
+
+		}
+		//是最后一级
+		else if ("T".equals(iffinalItem)) {
+			//通过
+			if (operate == 1) {
+				//todo 调用feign直接通过
+				auditProecess.setAuditStatus("A");
+				R r = leadsClient.leadsPassCheck(auditProecess.getSrcBillId());
+				if (!r.isSuccess()) {
+					throw new SecurityException("修改销售机会失败");
+				}
+
+				sendMessage.setMessageBody("您的请核已通过,请继续操作");
+				R save = messageClient.save(sendMessage);
+				if (!save.isSuccess()) {
+					throw new SecurityException("发送消息失败");
+				}
+			}
+			//不通过
+			else if (operate == 2) {
+				//todo 调用feign取消
+				auditProecess.setAuditStatus("B");
+				R r = leadsClient.leadsPassCancel(auditProecess.getSrcBillId());
+				if (!r.isSuccess()) {
+					throw new SecurityException("修改销售机会失败");
+				}
+				sendMessage.setMessageBody("您的请核未通过,驳回原因:" + auditProecess.getAuditMsg());
+				R save = messageClient.save(sendMessage);
+				if (!save.isSuccess()) {
+					throw new SecurityException("发送消息失败");
+				}
+			}
+		} else {
+			throw new SecurityException("审批异常,请联系管理员");
+		}
+
+		cleanMsg(proecessTemp.getAuditUserId(), AuthUtil.getUserId(), proecessTemp.getSrcBillId());
+
+		//保存操作记录
+		auditProecess.setAuditMsg(auditProecess.getAuditMsg());
+		auditProecess.setAuditItem(new Date());
+		baseMapper.updateById(auditProecess);
+	}
+
 	private void sendMsgToGroup(Message message, String group) {
 		List<String> userList = Arrays.asList(group.split(","));
 		userList.forEach(user -> {

+ 27 - 14
blade-service/blade-client/src/main/java/org/springblade/client/affairs/controller/AffairsController.java

@@ -2,7 +2,6 @@ package org.springblade.client.affairs.controller;
 
 import com.alibaba.cloud.commons.lang.StringUtils;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import io.swagger.annotations.Api;
@@ -23,6 +22,7 @@ import org.springblade.core.tool.utils.Func;
 import org.springframework.web.bind.annotation.*;
 
 import javax.validation.Valid;
+import java.util.List;
 
 /**
  * 商品详情表 控制器
@@ -59,12 +59,12 @@ public class AffairsController extends BladeController {
 	@ApiOperation(value = "分页", notes = "传入goodsDesc")
 	public R<IPage<GoodsDesc>> list(GoodsDescVO goodsDesc, Query query) {
 		LambdaQueryWrapper<GoodsDesc> queryWrapper = new LambdaQueryWrapper<>();
-		queryWrapper.eq(StringUtils.isNotBlank(goodsDesc.getGoodsTypeId()),GoodsDesc::getGoodsTypeId,goodsDesc.getGoodsTypeId());
-		queryWrapper.like(StringUtils.isNotBlank(goodsDesc.getCname()),GoodsDesc::getCname,goodsDesc.getCname());
-		queryWrapper.like(StringUtils.isNotBlank(goodsDesc.getCode()),GoodsDesc::getCode,goodsDesc.getCode());
-		queryWrapper.eq(GoodsDesc::getTenantId,AuthUtil.getTenantId());
-		queryWrapper.eq(GoodsDesc::getIsDeleted,0);
-		queryWrapper.eq(GoodsDesc::getType,GoodsTypeEnum.AFFAIRS.getType());
+		queryWrapper.eq(StringUtils.isNotBlank(goodsDesc.getGoodsTypeId()), GoodsDesc::getGoodsTypeId, goodsDesc.getGoodsTypeId());
+		queryWrapper.like(StringUtils.isNotBlank(goodsDesc.getCname()), GoodsDesc::getCname, goodsDesc.getCname());
+		queryWrapper.like(StringUtils.isNotBlank(goodsDesc.getCode()), GoodsDesc::getCode, goodsDesc.getCode());
+		queryWrapper.eq(GoodsDesc::getTenantId, AuthUtil.getTenantId());
+		queryWrapper.eq(GoodsDesc::getIsDeleted, 0);
+		queryWrapper.eq(GoodsDesc::getType, GoodsTypeEnum.AFFAIRS.getType());
 		IPage<GoodsDesc> pages = goodsDescService.page(Condition.getPage(query), queryWrapper);
 		return R.data(pages);
 	}
@@ -115,14 +115,13 @@ public class AffairsController extends BladeController {
 	@ApiOperationSupport(order = 6)
 	@ApiOperation(value = "新增或修改", notes = "传入goodsDesc")
 	public R submit(@Valid @RequestBody GoodsDesc goodsDesc) {
-		 //验证唯一性
-		LambdaQueryWrapper<GoodsDesc> lambdaQueryWrapper=new LambdaQueryWrapper<>();
-		lambdaQueryWrapper.eq(GoodsDesc::getCode,goodsDesc.getCode());
-		lambdaQueryWrapper.eq(GoodsDesc::getCname,goodsDesc.getCname());
-		lambdaQueryWrapper.eq(GoodsDesc::getType,1);
+		//验证唯一性
+		LambdaQueryWrapper<GoodsDesc> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+		lambdaQueryWrapper.eq(GoodsDesc::getCode, goodsDesc.getCode());
+		lambdaQueryWrapper.eq(GoodsDesc::getCname, goodsDesc.getCname());
+		lambdaQueryWrapper.eq(GoodsDesc::getType, 1);
 		GoodsDesc serviceOne = goodsDescService.getOne(lambdaQueryWrapper);
-		if(serviceOne!=null&& serviceOne.getId()==null)
-		{
+		if (serviceOne != null && serviceOne.getId() == null) {
 			throw new ServiceException("存在重复数据,请修改后添加");
 		}
 		if (StringUtils.isBlank(goodsDesc.getTenantId())) {
@@ -165,4 +164,18 @@ public class AffairsController extends BladeController {
 		return R.data(goodsDescService.selectGoods(Condition.getPage(query), goodsDesc));
 	}
 
+	/**
+	 * 获取项目名称
+	 */
+	@GetMapping("/getGoodsDescList")
+	@ApiOperation(value = "获取项目名称")
+	public R getGoodsDescList() {
+		LambdaQueryWrapper<GoodsDesc> queryWrapper = new LambdaQueryWrapper<>();
+		queryWrapper.eq(GoodsDesc::getTenantId, AuthUtil.getTenantId());
+		queryWrapper.eq(GoodsDesc::getIsDeleted, 0);
+		queryWrapper.eq(GoodsDesc::getType, GoodsTypeEnum.AFFAIRS.getType());
+		List<GoodsDesc> goodsDescList = goodsDescService.list(queryWrapper);
+		return R.data(goodsDescList);
+	}
+
 }

+ 11 - 0
blade-service/blade-client/src/main/java/org/springblade/client/corps/feign/CorpsDescClient.java

@@ -192,6 +192,17 @@ public class CorpsDescClient implements ICorpsDescClient {
 		return bankService.getCorpsBank(pid,tenantId);
 	}
 
+	/**
+	 * 添加客户
+	 *
+	 * @param corpsDesc    客户信息
+	 * @return
+	 */
+	@Override
+	public R insertCorp(CorpsDesc corpsDesc) {
+		return service.submit(corpsDesc);
+	}
+
 	@Override
 	public List<Long> getGoodTypeMessage(Long goodTypeId) {
 		return goodsTypeService.goodTypeIdList(goodTypeId.toString());

+ 11 - 0
blade-service/blade-client/src/main/java/org/springblade/client/goods/feign/GoodsDescClient.java

@@ -173,6 +173,17 @@ public class GoodsDescClient implements IGoodsDescClient {
 	}
 
 	/**
+	 * 根据商品id获取商品信息
+	 *
+	 * @param id  商品id
+	 * @return
+	 */
+	@Override
+	public GoodsDesc getGoodsDescDetail(Long id) {
+		return goodsDescService.selectGoodsMessage(id);
+	}
+
+	/**
 	 * 递归查询ID
 	 */
 	private void selectChildById(Long id, List<Long> idList) {

+ 1 - 0
blade-service/blade-deliver-goods/src/main/java/org/springblade/deliver/goods/controller/ImportDeliveryController.java

@@ -170,6 +170,7 @@ public class ImportDeliveryController extends BladeController {
 		if (StringUtils.isNotBlank(deliveryMessage.getDeliveryStatus()) && deliveryMessage.getDeliveryStatus().equals(DeliveryStatusEnum.DELIVER.getType())){
 			throw  new SecurityException("已发货不能删除");
 		}
+		delivery.setIsDeleted(1);
 		deliveryService.updateById(delivery);
 		deliveryFeesService.updateByPid(delivery.getId());
 		deliveryFilesService.updateByPid(delivery.getId());

+ 4 - 0
blade-service/blade-deliver-goods/src/main/java/org/springblade/deliver/goods/receiving/ImportReCeVingController.java

@@ -36,6 +36,7 @@ import org.springblade.core.secure.utils.SecureUtil;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.deliver.goods.entity.Delivery;
+import org.springblade.deliver.goods.service.IDeliveryItemsService;
 import org.springblade.deliver.goods.service.IDeliveryService;
 import org.springblade.deliver.goods.vo.DeliveryVO;
 import org.springblade.system.user.entity.User;
@@ -59,6 +60,8 @@ public class ImportReCeVingController extends BladeController {
 
 	private final IDeliveryService deliveryService;
 
+	private final IDeliveryItemsService deliveryItemsService;
+
 	private ICorpsDescClient corpsDescClient;//获取客户信息
 
 	private IStorageClient iStorageClient;//库存信息
@@ -174,6 +177,7 @@ public class ImportReCeVingController extends BladeController {
 			return R.fail(500,"请选择要删除的数据");
 		}
 		delivery.setIsDeleted(1);
+		deliveryItemsService.updateByPid(delivery.getId());
 		return R.status(deliveryService.updateById(delivery));
 	}
 

+ 12 - 0
blade-service/blade-project/src/main/java/org/springblade/project/controller/ProjectController.java

@@ -919,6 +919,18 @@ public class ProjectController {
 		return R.data(Collections.EMPTY_LIST);
 	}
 
+	/**
+	 * 派工
+	 * @param serviceProject
+	 * @return
+	 */
+	@PutMapping("dispatch")
+	public R dispatch(@RequestBody ServiceProject serviceProject) {
+		serviceProjectService.dispatch(serviceProject);
+		return R.data(serviceProject.getId());
+	}
+
+
 	//计算每个月的服务费
 	public ServiceProject calculateServiceCharge(String userName, Long id, int flag, Long year) {
 		if (flag == 1) {

+ 7 - 0
blade-service/blade-project/src/main/java/org/springblade/project/service/ServiceProjectService.java

@@ -47,4 +47,11 @@ public interface ServiceProjectService extends IService<ServiceProject>
 	int getCorpIdList(String tenantId, String beginTime, String endTime);
 
 	List<ServiceProject> inactiveCorpList(String tenantId, String beginTime, String endTime);
+
+	/**
+	 * 派工接口
+	 * @param serviceProject
+	 * @return
+	 */
+	int dispatch(ServiceProject serviceProject);
 }

+ 310 - 299
blade-service/blade-project/src/main/java/org/springblade/project/service/impl/ServiceProjectServiceImpl.java

@@ -1,7 +1,8 @@
 package org.springblade.project.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import jdk.nashorn.internal.ir.CallNode;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.AllArgsConstructor;
 import net.logstash.logback.encoder.org.apache.commons.lang3.StringUtils;
 import org.springblade.check.dto.AuditProecessDTO;
@@ -9,8 +10,6 @@ import org.springblade.check.entity.AuditPathsActs;
 import org.springblade.check.entity.AuditPathsLevels;
 import org.springblade.check.feign.ICheckClient;
 import org.springblade.client.feign.ISerialClient;
-import org.springblade.core.mp.base.BaseService;
-import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.secure.utils.SecureUtil;
 import org.springblade.core.tool.api.R;
@@ -20,259 +19,222 @@ import org.springblade.project.entity.ServiceProjectItem;
 import org.springblade.project.mapper.ServiceProjectFilesMapper;
 import org.springblade.project.mapper.ServiceProjectItemMapper;
 import org.springblade.project.mapper.ServiceProjectMapper;
-import org.springblade.project.service.ServiceProjectItemService;
 import org.springblade.project.service.ServiceProjectService;
-import org.springframework.beans.BeanUtils;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.interceptor.TransactionAspectSupport;
 import org.springframework.util.CollectionUtils;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import org.springframework.web.bind.annotation.RequestParam;
 
 import javax.annotation.Resource;
 import java.math.BigDecimal;
+import java.util.Calendar;
 import java.util.Date;
 import java.util.List;
-import java.util.Map;
 import java.util.stream.Collectors;
 
 
 @Service
 @AllArgsConstructor
-public class ServiceProjectServiceImpl extends ServiceImpl<ServiceProjectMapper, ServiceProject> implements ServiceProjectService
-{
-   @Resource
-   private ServiceProjectMapper serviceProjectMapper;
+public class ServiceProjectServiceImpl extends ServiceImpl<ServiceProjectMapper, ServiceProject> implements ServiceProjectService {
 	@Resource
-   private ServiceProjectItemMapper serviceProjectItemMapper;
+	private ServiceProjectMapper serviceProjectMapper;
 	@Resource
-   private ServiceProjectFilesMapper serviceProjectFilesMapper;
+	private ServiceProjectItemMapper serviceProjectItemMapper;
 	@Resource
-   private ISerialClient serialClient;//生成系统编号
+	private ServiceProjectFilesMapper serviceProjectFilesMapper;
+	@Resource
+	private ISerialClient serialClient;//生成系统编号
 
 	private final ICheckClient iCheckClient;
 
 	@Override
 	@Transactional
-	public void modify(ServiceProject serviceProject)
-	{
+	public void modify(ServiceProject serviceProject) {
 		List<ServiceProjectItem> itemList = serviceProject.getItemList();
 
 		List<ServiceProjectFiles> filesList = serviceProject.getFilesList();
 		//新增操作,不用考虑子项问题,子项必然是新增
-      if(serviceProject.getId()==null)
-      {
-		  BigDecimal debitAmount = serviceProject.getDebitAmount();//合同总金额
-		  BigDecimal settlmentAmount = serviceProject.getSettlmentAmount();//已收金额
-		  BigDecimal balanceAmount = serviceProject.getBalanceAmount();//未收金额
-          if(balanceAmount.add(settlmentAmount).compareTo(debitAmount)!=0)
-          {
-             throw new RuntimeException("已收金额+未收金额≠合同总金额,请确认后提交");
-		  }
-		  R billNo = serialClient.getBillNo("ZY", "ZY","ZY");
-          if(billNo.isSuccess())
-          {
-			  serviceProject.setSysNo(billNo.getData().toString());
-		  }
-		  serviceProject.setTenantId(AuthUtil.getTenantId());
-		  serviceProject.setCreateTime(new Date());
-		  serviceProject.setCreateUser(SecureUtil.getUserId());
-		  serviceProject.setCreateUserName(SecureUtil.getUser().getUserName());
-		  serviceProjectMapper.insert(serviceProject);
-		  if(!CollectionUtils.isEmpty(itemList))
-		  {
-			  itemList.forEach(e->{
-			  	//如果是退费,需要取反
-				  if(e.getProjectType()==2)
-				  {
-					  if(e.getServiceCharge().compareTo(BigDecimal.ZERO)==1)
-					  {
-						  e.setServiceCharge(e.getServiceCharge()!=null?e.getServiceCharge().negate():new BigDecimal("0"));
-					  }
-					  if(e.getMatMoney().compareTo(BigDecimal.ZERO)==1)
-					  {
-						  e.setMatMoney(e.getMatMoney()!=null?e.getMatMoney().negate():new BigDecimal("0"));
-					  }
-					  if(e.getAmount().compareTo(BigDecimal.ZERO)==1)
-					  {
-						  e.setAmount(e.getAmount()!=null?e.getAmount().negate():new BigDecimal("0"));
-					  }
-
-				  }
-			  	e.setTenantId(AuthUtil.getTenantId());
-			  	e.setPId(serviceProject.getId());
-                e.setCreateTime(new Date());
-                e.setCreateUser(SecureUtil.getUserId());
-				  e.setCreateUserName(SecureUtil.getUser().getUserName());
-                serviceProjectItemMapper.insert(e);
-			  });
-		  }
-
-		  if(!CollectionUtils.isEmpty(filesList))
-		  {
-			  filesList.forEach(e->{
-				  e.setTenantId(AuthUtil.getTenantId());
-				  e.setPId(serviceProject.getId());
-				  e.setCreateTime(new Date());
-				  e.setCreateUser(SecureUtil.getUserId());
-				  e.setCreateUserName(SecureUtil.getUser().getUserName());
-				  serviceProjectFilesMapper.insert(e);
-			  });
-		  }
-
-
-	  }
-	  //修改操作,则需要判断子项是否为新增、修改、删除
-      else
-      {
-      	  //操作主表
-		  serviceProjectMapper.updateById(serviceProject);
-		  //操作字表,查询之前的子项记录
-		  LambdaQueryWrapper<ServiceProjectItem> itemLambdaQueryWrapper=new LambdaQueryWrapper<>();
-		  itemLambdaQueryWrapper
-			  .eq(ServiceProjectItem::getIsDeleted,0)
-			  .eq(ServiceProjectItem::getPId,serviceProject.getId());
-		  List<ServiceProjectItem> originServiceProjectItems = serviceProjectItemMapper.selectList(itemLambdaQueryWrapper);
-
-		  if(!CollectionUtils.isEmpty(itemList))
-		  {
-			  //判断新增或者修改操作
-			  itemList.forEach(ls->{
-				  //修改
-				  if(null!=ls.getId())
-				  {
-					  if(ls.getProjectType()==2)
-					  {
-					  	  if(ls.getServiceCharge().compareTo(BigDecimal.ZERO)==1)
-					  	   {
-							 ls.setServiceCharge(ls.getServiceCharge()!=null?ls.getServiceCharge().negate():new BigDecimal("0"));
-					  	   }
-						  if(ls.getMatMoney().compareTo(BigDecimal.ZERO)==1)
-						  {
-							  ls.setMatMoney(ls.getMatMoney()!=null?ls.getMatMoney().negate():new BigDecimal("0"));
-						  }
-						  if(ls.getAmount().compareTo(BigDecimal.ZERO)==1)
-						  {
-							  ls.setAmount(ls.getAmount()!=null?ls.getAmount().negate():new BigDecimal("0"));
-						  }
-
-					  }
-					  ls.setUpdateUser(SecureUtil.getUserId());
-					  ls.setUpdateTime(new Date());
-					  ls.setUpdateUserName(SecureUtil.getUser().getUserName());
-					  serviceProjectItemMapper.updateById(ls);
-				  }
-				  //新增
-				  else
-				  {
-					  if(ls.getProjectType()==2)
-					  {
-						  if(ls.getServiceCharge().compareTo(BigDecimal.ZERO)==1)
-						  {
-							  ls.setServiceCharge(ls.getServiceCharge()!=null?ls.getServiceCharge().negate():new BigDecimal("0"));
-						  }
-						  if(ls.getMatMoney().compareTo(BigDecimal.ZERO)==1)
-						  {
-							  ls.setMatMoney(ls.getMatMoney()!=null?ls.getMatMoney().negate():new BigDecimal("0"));
-						  }
-						  if(ls.getAmount().compareTo(BigDecimal.ZERO)==1)
-						  {
-							  ls.setAmount(ls.getAmount()!=null?ls.getAmount().negate():new BigDecimal("0"));
-						  }
-
-					  }
-					  ls.setTenantId(AuthUtil.getTenantId());
-				  	  ls.setPId(serviceProject.getId());
-					  ls.setCreateTime(new Date());
-					  ls.setCreateUser(SecureUtil.getUserId());
-					  String deptId = SecureUtil.getDeptId();
-					  ls.setCreateDept(StringUtils.isNoneBlank(deptId)?Long.valueOf(deptId):-1);
-					  ls.setCreateUserName(SecureUtil.getUser().getUserName());
-					  serviceProjectItemMapper.insert(ls);
-				  }
-			  });
-
-			  //判断文件列表新增或者修改操作
-			  if(!CollectionUtils.isEmpty(filesList))
-			  {
-				  filesList.forEach(ls->{
-					  //修改
-					  if(null!=ls.getId())
-					  {
-						  ls.setUpdateUser(SecureUtil.getUserId());
-						  ls.setUpdateTime(new Date());
-						  ls.setUpdateUserName(SecureUtil.getUser().getUserName());
-						  serviceProjectFilesMapper.updateById(ls);
-					  }
-					  //新增
-					  else
-					  {
-						  ls.setTenantId(AuthUtil.getTenantId());
-						  ls.setPId(serviceProject.getId());
-						  ls.setCreateTime(new Date());
-						  ls.setCreateUser(SecureUtil.getUserId());
-						  String deptId = SecureUtil.getDeptId();
-						  ls.setCreateDept(StringUtils.isNoneBlank(deptId)?Long.valueOf(deptId):-1);
-						  ls.setCreateUserName(SecureUtil.getUser().getUserName());
-						  serviceProjectFilesMapper.insert(ls);
-					  }
-				  });
-			  }
-
-
-
-			  //查询原来的子项集合 与 传入的子项进行比较, 判断是否删除
-			  if(!CollectionUtils.isEmpty(originServiceProjectItems))
-			  {
-			  	  //先删除操作,开始比较id
-				  List<Long> oringinIds = originServiceProjectItems.stream().map(ServiceProjectItem::getId).collect(Collectors.toList());
-				  List<Long> newIds = itemList.stream().map(ServiceProjectItem::getId).collect(Collectors.toList());
-                  //id取交集,交集之外的id可以删除
-				  oringinIds.removeAll(newIds);
-				  if(!CollectionUtils.isEmpty(oringinIds))
-				  {
-					  //查询删除
-					  LambdaQueryWrapper<ServiceProjectItem> delete=new LambdaQueryWrapper<>();
-					  delete
-						  .eq(ServiceProjectItem::getPId,serviceProject.getId())
-						  .in(!CollectionUtils.isEmpty(oringinIds),ServiceProjectItem::getId,oringinIds);
-					  List<ServiceProjectItem> deleteList = serviceProjectItemMapper.selectList(delete);
-					  if(!CollectionUtils.isEmpty(deleteList))
-					  {
-						  deleteList.forEach(e->{
-							  e.setUpdateUser(SecureUtil.getUserId());
-							  e.setUpdateTime(new Date());
-							  e.setUpdateUserName(SecureUtil.getUser().getUserName());
-							  serviceProjectItemMapper.deleteById(e.getId());
-						  });
-					  }
-				  }
-
-			  }
-		  }
-		  else
-		  {
-		  	//如果itemList为空,代表删除之前所有子项
-			if(!CollectionUtils.isEmpty(originServiceProjectItems))
-			{
-				originServiceProjectItems.forEach(it->{
-					it.setUpdateUser(SecureUtil.getUserId());
-					it.setUpdateTime(new Date());
-					it.setUpdateUserName(SecureUtil.getUser().getUserName());
-					serviceProjectItemMapper.deleteById(it.getId());
+		if (serviceProject.getId() == null) {
+			BigDecimal debitAmount = serviceProject.getDebitAmount();//合同总金额
+			BigDecimal settlmentAmount = serviceProject.getSettlmentAmount();//已收金额
+			BigDecimal balanceAmount = serviceProject.getBalanceAmount();//未收金额
+			if (balanceAmount.add(settlmentAmount).compareTo(debitAmount) != 0) {
+				throw new RuntimeException("已收金额+未收金额≠合同总金额,请确认后提交");
+			}
+			R billNo = serialClient.getBillNo("ZY", "ZY", "ZY");
+			if (billNo.isSuccess()) {
+				serviceProject.setSysNo(billNo.getData().toString());
+			}
+			serviceProject.setTenantId(AuthUtil.getTenantId());
+			serviceProject.setCreateTime(new Date());
+			serviceProject.setCreateUser(SecureUtil.getUserId());
+			serviceProject.setCreateUserName(SecureUtil.getUser().getUserName());
+			serviceProjectMapper.insert(serviceProject);
+			if (!CollectionUtils.isEmpty(itemList)) {
+				itemList.forEach(e -> {
+					//如果是退费,需要取反
+					if (e.getProjectType() == 2) {
+						if (e.getServiceCharge().compareTo(BigDecimal.ZERO) == 1) {
+							e.setServiceCharge(e.getServiceCharge() != null ? e.getServiceCharge().negate() : new BigDecimal("0"));
+						}
+						if (e.getMatMoney().compareTo(BigDecimal.ZERO) == 1) {
+							e.setMatMoney(e.getMatMoney() != null ? e.getMatMoney().negate() : new BigDecimal("0"));
+						}
+						if (e.getAmount().compareTo(BigDecimal.ZERO) == 1) {
+							e.setAmount(e.getAmount() != null ? e.getAmount().negate() : new BigDecimal("0"));
+						}
+
+					}
+					e.setTenantId(AuthUtil.getTenantId());
+					e.setPId(serviceProject.getId());
+					e.setCreateTime(new Date());
+					e.setCreateUser(SecureUtil.getUserId());
+					e.setCreateUserName(SecureUtil.getUser().getUserName());
+					e.setTaskStatus(10);
+					serviceProjectItemMapper.insert(e);
+				});
+			}
+
+			if (!CollectionUtils.isEmpty(filesList)) {
+				filesList.forEach(e -> {
+					e.setTenantId(AuthUtil.getTenantId());
+					e.setPId(serviceProject.getId());
+					e.setCreateTime(new Date());
+					e.setCreateUser(SecureUtil.getUserId());
+					e.setCreateUserName(SecureUtil.getUser().getUserName());
+					serviceProjectFilesMapper.insert(e);
+				});
+			}
+
+
+		}
+		//修改操作,则需要判断子项是否为新增、修改、删除
+		else {
+			//操作主表
+			serviceProjectMapper.updateById(serviceProject);
+			//操作字表,查询之前的子项记录
+			LambdaQueryWrapper<ServiceProjectItem> itemLambdaQueryWrapper = new LambdaQueryWrapper<>();
+			itemLambdaQueryWrapper
+				.eq(ServiceProjectItem::getIsDeleted, 0)
+				.eq(ServiceProjectItem::getPId, serviceProject.getId());
+			List<ServiceProjectItem> originServiceProjectItems = serviceProjectItemMapper.selectList(itemLambdaQueryWrapper);
+
+			if (!CollectionUtils.isEmpty(itemList)) {
+				//判断新增或者修改操作
+				itemList.forEach(ls -> {
+					//修改
+					if (null != ls.getId()) {
+						if (ls.getProjectType() == 2) {
+							if (ls.getServiceCharge().compareTo(BigDecimal.ZERO) == 1) {
+								ls.setServiceCharge(ls.getServiceCharge() != null ? ls.getServiceCharge().negate() : new BigDecimal("0"));
+							}
+							if (ls.getMatMoney().compareTo(BigDecimal.ZERO) == 1) {
+								ls.setMatMoney(ls.getMatMoney() != null ? ls.getMatMoney().negate() : new BigDecimal("0"));
+							}
+							if (ls.getAmount().compareTo(BigDecimal.ZERO) == 1) {
+								ls.setAmount(ls.getAmount() != null ? ls.getAmount().negate() : new BigDecimal("0"));
+							}
+
+						}
+						ls.setUpdateUser(SecureUtil.getUserId());
+						ls.setUpdateTime(new Date());
+						ls.setUpdateUserName(SecureUtil.getUser().getUserName());
+						serviceProjectItemMapper.updateById(ls);
+					}
+					//新增
+					else {
+						if (ls.getProjectType() == 2) {
+							if (ls.getServiceCharge().compareTo(BigDecimal.ZERO) == 1) {
+								ls.setServiceCharge(ls.getServiceCharge() != null ? ls.getServiceCharge().negate() : new BigDecimal("0"));
+							}
+							if (ls.getMatMoney().compareTo(BigDecimal.ZERO) == 1) {
+								ls.setMatMoney(ls.getMatMoney() != null ? ls.getMatMoney().negate() : new BigDecimal("0"));
+							}
+							if (ls.getAmount().compareTo(BigDecimal.ZERO) == 1) {
+								ls.setAmount(ls.getAmount() != null ? ls.getAmount().negate() : new BigDecimal("0"));
+							}
+
+						}
+						ls.setTenantId(AuthUtil.getTenantId());
+						ls.setPId(serviceProject.getId());
+						ls.setCreateTime(new Date());
+						ls.setCreateUser(SecureUtil.getUserId());
+						String deptId = SecureUtil.getDeptId();
+						ls.setCreateDept(StringUtils.isNoneBlank(deptId) ? Long.valueOf(deptId) : -1);
+						ls.setCreateUserName(SecureUtil.getUser().getUserName());
+						serviceProjectItemMapper.insert(ls);
+					}
 				});
+
+				//判断文件列表新增或者修改操作
+				if (!CollectionUtils.isEmpty(filesList)) {
+					filesList.forEach(ls -> {
+						//修改
+						if (null != ls.getId()) {
+							ls.setUpdateUser(SecureUtil.getUserId());
+							ls.setUpdateTime(new Date());
+							ls.setUpdateUserName(SecureUtil.getUser().getUserName());
+							serviceProjectFilesMapper.updateById(ls);
+						}
+						//新增
+						else {
+							ls.setTenantId(AuthUtil.getTenantId());
+							ls.setPId(serviceProject.getId());
+							ls.setCreateTime(new Date());
+							ls.setCreateUser(SecureUtil.getUserId());
+							String deptId = SecureUtil.getDeptId();
+							ls.setCreateDept(StringUtils.isNoneBlank(deptId) ? Long.valueOf(deptId) : -1);
+							ls.setCreateUserName(SecureUtil.getUser().getUserName());
+							serviceProjectFilesMapper.insert(ls);
+						}
+					});
+				}
+
+
+				//查询原来的子项集合 与 传入的子项进行比较, 判断是否删除
+				if (!CollectionUtils.isEmpty(originServiceProjectItems)) {
+					//先删除操作,开始比较id
+					List<Long> oringinIds = originServiceProjectItems.stream().map(ServiceProjectItem::getId).collect(Collectors.toList());
+					List<Long> newIds = itemList.stream().map(ServiceProjectItem::getId).collect(Collectors.toList());
+					//id取交集,交集之外的id可以删除
+					oringinIds.removeAll(newIds);
+					if (!CollectionUtils.isEmpty(oringinIds)) {
+						//查询删除
+						LambdaQueryWrapper<ServiceProjectItem> delete = new LambdaQueryWrapper<>();
+						delete
+							.eq(ServiceProjectItem::getPId, serviceProject.getId())
+							.in(!CollectionUtils.isEmpty(oringinIds), ServiceProjectItem::getId, oringinIds);
+						List<ServiceProjectItem> deleteList = serviceProjectItemMapper.selectList(delete);
+						if (!CollectionUtils.isEmpty(deleteList)) {
+							deleteList.forEach(e -> {
+								e.setUpdateUser(SecureUtil.getUserId());
+								e.setUpdateTime(new Date());
+								e.setUpdateUserName(SecureUtil.getUser().getUserName());
+								serviceProjectItemMapper.deleteById(e.getId());
+							});
+						}
+					}
+
+				}
+			} else {
+				//如果itemList为空,代表删除之前所有子项
+				if (!CollectionUtils.isEmpty(originServiceProjectItems)) {
+					originServiceProjectItems.forEach(it -> {
+						it.setUpdateUser(SecureUtil.getUserId());
+						it.setUpdateTime(new Date());
+						it.setUpdateUserName(SecureUtil.getUser().getUserName());
+						serviceProjectItemMapper.deleteById(it.getId());
+					});
+				}
 			}
-		  }
-	  }
-        //检查明细总金额是否超过主表总金额
-		LambdaQueryWrapper<ServiceProjectItem> itemLambdaQueryWrapper=new LambdaQueryWrapper();
-		itemLambdaQueryWrapper.eq(ServiceProjectItem::getPId,serviceProject.getId());
+		}
+		//检查明细总金额是否超过主表总金额
+		LambdaQueryWrapper<ServiceProjectItem> itemLambdaQueryWrapper = new LambdaQueryWrapper();
+		itemLambdaQueryWrapper.eq(ServiceProjectItem::getPId, serviceProject.getId());
 		List<ServiceProjectItem> serviceProjectItems = serviceProjectItemMapper.selectList(itemLambdaQueryWrapper);
-        //检查金额是否超额
+		//检查金额是否超额
 		//checkMoney(serviceProject.getId(),serviceProjectItems);
-        //绑定主表对应的额度
+		//绑定主表对应的额度
 		BigDecimal totalServiceCharge = serviceProjectItems.stream().filter(e -> e.getServiceCharge() != null).map(ServiceProjectItem::getServiceCharge).reduce(BigDecimal.ZERO, BigDecimal::add);
 		BigDecimal totalMatMoney = serviceProjectItems.stream().filter(e -> e.getMatMoney() != null).map(ServiceProjectItem::getMatMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
 		BigDecimal totalCostReturn = serviceProjectItems.stream().filter(e -> e.getCostReturn() != null).map(ServiceProjectItem::getCostReturn).reduce(BigDecimal.ZERO, BigDecimal::add);
@@ -286,10 +248,9 @@ public class ServiceProjectServiceImpl extends ServiceImpl<ServiceProjectMapper,
 
 	@Override
 	@Transactional
-	public synchronized R getSysNo()
-	{
-		R billNo = serialClient.getBillNo("XM","XM","XM");
-		if (billNo.getCode() != 200){
+	public synchronized R getSysNo() {
+		R billNo = serialClient.getBillNo("XM", "XM", "XM");
+		if (billNo.getCode() != 200) {
 			TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
 			throw new RuntimeException("生成系统编号失败");
 		}
@@ -298,22 +259,20 @@ public class ServiceProjectServiceImpl extends ServiceImpl<ServiceProjectMapper,
 
 	@Override
 	@Transactional
-	public void updateItemStatus(Long itemId, int status,String accountName,String accountBank,String accountNo,Date payTime)
-	{
+	public void updateItemStatus(Long itemId, int status, String accountName, String accountBank, String accountNo, Date payTime) {
 		ServiceProjectItem serviceProjectItem = serviceProjectItemMapper.selectById(itemId);
 		serviceProjectItem.setAccountBank(accountBank);
 		serviceProjectItem.setAccountName(accountName);
 		serviceProjectItem.setAccountNo(accountNo);
 		serviceProjectItem.setUpdateTime(new Date());
 		serviceProjectItem.setUpdateUser(SecureUtil.getUserId());
-		if(serviceProjectItem==null)
-		{
+		if (serviceProjectItem == null) {
 			throw new RuntimeException("请确认传入id正确");
 		}
 		//明细已请核之后, 修改主表的status状态为1
-		if(status==1)
-		{	serviceProjectItem.setStatus(1);
-			ServiceProject serviceProject=new ServiceProject();
+		if (status == 1) {
+			serviceProjectItem.setStatus(1);
+			ServiceProject serviceProject = new ServiceProject();
 			serviceProject.setStatus(1);
 			serviceProject.setId(serviceProjectItem.getPId());
 			serviceProject.setUpdateUser(SecureUtil.getUserId());
@@ -322,15 +281,14 @@ public class ServiceProjectServiceImpl extends ServiceImpl<ServiceProjectMapper,
 			serviceProjectMapper.updateById(serviceProject);
 		}
 		//明细已结算之后, 修改主表的已收款项 和 未收款项
-		else if(status==5)
-		{
+		else if (status == 5) {
 			serviceProjectItem.setStatus(5);
 			serviceProjectItem.setPayTime(payTime);
 
 			ServiceProject targetServiceProject = serviceProjectMapper.selectById(serviceProjectItem.getPId());
 			//主表已收款项增加
 			targetServiceProject.setSettlmentAmount(targetServiceProject.getSettlmentAmount().add(serviceProjectItem.getAmount()));
-            //主表未收款项减少
+			//主表未收款项减少
 			targetServiceProject.setBalanceAmount(targetServiceProject.getBalanceAmount().subtract(serviceProjectItem.getAmount()));
 			targetServiceProject.setUpdateUser(SecureUtil.getUserId());
 			targetServiceProject.setUpdateTime(new Date());
@@ -339,8 +297,7 @@ public class ServiceProjectServiceImpl extends ServiceImpl<ServiceProjectMapper,
 
 		}
 		//撤回
-		else if(status==6)
-		{
+		else if (status == 6) {
 			ServiceProject targetServiceProject = serviceProjectMapper.selectById(serviceProjectItem.getPId());
 			//status=6代表撤回, item状态回到4
 			serviceProjectItem.setStatus(4);
@@ -352,10 +309,7 @@ public class ServiceProjectServiceImpl extends ServiceImpl<ServiceProjectMapper,
 			targetServiceProject.setUpdateTime(new Date());
 			targetServiceProject.setUpdateUserName(SecureUtil.getUser().getUserName());
 			serviceProjectMapper.updateById(targetServiceProject);
-		}
-
-		else
-		{
+		} else {
 			serviceProjectItem.setStatus(status);
 		}
 		serviceProjectItemMapper.updateById(serviceProjectItem);
@@ -364,34 +318,27 @@ public class ServiceProjectServiceImpl extends ServiceImpl<ServiceProjectMapper,
 
 	@Override
 	@Transactional
-	public void masterCheck(Long id,String url,String pageStatus,String pageLabel)
-	{
+	public void masterCheck(Long id, String url, String pageStatus, String pageLabel) {
 		ServiceProject serviceProject = serviceProjectMapper.selectById(id);
-		if(serviceProject==null)
-		{
+		if (serviceProject == null) {
 			throw new SecurityException("清核失败:主营项目不存在或已被删除");
 		}
-		if(serviceProject.getStatus()>0)
-		{
+		if (serviceProject.getStatus() > 0) {
 			throw new SecurityException("清核失败:主营项目已开启审批,禁止重复提交");
 		}
 		//查询子表是否符合请核条件
-		LambdaQueryWrapper<ServiceProjectItem> itemLambdaQueryWrapper=new LambdaQueryWrapper<>();
+		LambdaQueryWrapper<ServiceProjectItem> itemLambdaQueryWrapper = new LambdaQueryWrapper<>();
 		itemLambdaQueryWrapper
-			.eq(ServiceProjectItem::getPId,id)
-			.eq(ServiceProjectItem::getIsDeleted,0);
+			.eq(ServiceProjectItem::getPId, id)
+			.eq(ServiceProjectItem::getIsDeleted, 0);
 		List<ServiceProjectItem> serviceProjectItems = serviceProjectItemMapper.selectList(itemLambdaQueryWrapper);
-		if(!CollectionUtils.isEmpty(serviceProjectItems))
-		{
+		if (!CollectionUtils.isEmpty(serviceProjectItems)) {
 			//存在一个未结算完成, 都不可以请核
 			boolean match = serviceProjectItems.stream().anyMatch(e -> e.getStatus() != 5);
-			if(match)
-			{
+			if (match) {
 				throw new SecurityException("清核失败:子表有未结算完成的数据");
 			}
-		}
-		else
-		{
+		} else {
 			throw new SecurityException("清核失败:未查询到子表结算信息");
 		}
 
@@ -399,18 +346,16 @@ public class ServiceProjectServiceImpl extends ServiceImpl<ServiceProjectMapper,
 		AuditPathsActs pathsActs = iCheckClient.getActsByActId(2, "check_status");
 
 		//没开启审批流直接走 通过流程
-		if(pathsActs==null || pathsActs.getIsEnable()==2)
-		{
+		if (pathsActs == null || pathsActs.getIsEnable() == 2) {
 			this.projectPassCheck(id);
 		}
 		//走审批流
-	    else
-		{
+		else {
 			serviceProject.setStatus(1);
 			serviceProjectMapper.updateById(serviceProject);
 			//获取审批级次
 			List<AuditPathsLevels> auditPathsLevels = iCheckClient.listLevelsByActId(2, "status");
-			AuditProecessDTO auditProecessDTO=new AuditProecessDTO();
+			AuditProecessDTO auditProecessDTO = new AuditProecessDTO();
 			//追加跳转路由url
 			auditProecessDTO.setUrl(url);
 			auditProecessDTO.setPageStatus(pageStatus);
@@ -426,8 +371,7 @@ public class ServiceProjectServiceImpl extends ServiceImpl<ServiceProjectMapper,
 			auditProecessDTO.setSendName(AuthUtil.getUserName());
 			auditProecessDTO.setSendTime(new Date());
 			R ServiceProcess = iCheckClient.createFinanceProcess(auditProecessDTO);
-			if(!ServiceProcess.isSuccess())
-			{
+			if (!ServiceProcess.isSuccess()) {
 				throw new SecurityException("操作失败,请联系管理员");
 			}
 		}
@@ -437,11 +381,9 @@ public class ServiceProjectServiceImpl extends ServiceImpl<ServiceProjectMapper,
 
 	@Override
 	@Transactional
-	public void projectPassCheck(Long id)
-	{
+	public void projectPassCheck(Long id) {
 		ServiceProject serviceProject = serviceProjectMapper.selectById(id);
-		if(serviceProject==null)
-		{
+		if (serviceProject == null) {
 			throw new SecurityException("操作失败:未查询到主营项目数据");
 		}
 		serviceProject.setStatus(3);
@@ -450,11 +392,9 @@ public class ServiceProjectServiceImpl extends ServiceImpl<ServiceProjectMapper,
 
 	@Override
 	@Transactional
-	public void projectPassCancel(Long id)
-	{
+	public void projectPassCancel(Long id) {
 		ServiceProject serviceProject = serviceProjectMapper.selectById(id);
-		if(serviceProject==null)
-		{
+		if (serviceProject == null) {
 			throw new SecurityException("操作失败:未查询到主营项目数据");
 		}
 		serviceProject.setStatus(0);
@@ -463,18 +403,15 @@ public class ServiceProjectServiceImpl extends ServiceImpl<ServiceProjectMapper,
 
 	@Override
 	@Transactional
-	public void settleAccounts(Long id,int status, String accountName,String accountBank,Date payTime,String accountNo)
-	{
+	public void settleAccounts(Long id, int status, String accountName, String accountBank, Date payTime, String accountNo) {
 		ServiceProjectItem serviceProjectItem = serviceProjectItemMapper.selectById(id);
 		serviceProjectItem.setAccountName(accountName);
 		serviceProjectItem.setAccountBank(accountBank);
 		serviceProjectItem.setAccountNo(accountNo);
 		serviceProjectItem.setPayTime(payTime);
 
-		if(status==5)
-		{
-			if(serviceProjectItem.getStatus()==5)
-			{
+		if (status == 5) {
+			if (serviceProjectItem.getStatus() == 5) {
 				throw new SecurityException("操作失败:此明细已完成结算,禁止重复提交");
 			}
 			//主营项目子表操作
@@ -491,11 +428,8 @@ public class ServiceProjectServiceImpl extends ServiceImpl<ServiceProjectMapper,
 			targetServiceProject.setUpdateTime(new Date());
 			targetServiceProject.setUpdateUserName(SecureUtil.getUser().getUserName());
 			serviceProjectMapper.updateById(targetServiceProject);
-		}
-		else if(status==6)
-		{
-			if(serviceProjectItem.getStatus()!=5)
-			{
+		} else if (status == 6) {
+			if (serviceProjectItem.getStatus() != 5) {
 				throw new SecurityException("操作失败:此明细暂未结算,禁止撤回");
 			}
 			//status=6代表撤回, item状态回到4
@@ -517,15 +451,13 @@ public class ServiceProjectServiceImpl extends ServiceImpl<ServiceProjectMapper,
 	}
 
 	@Override
-	public ServiceProject calculateServiceCharge(String tenantId, String year, Long corpId, Long createUser,String userName)
-	  {
-		return serviceProjectItemMapper.calculateServiceCharge(tenantId,year,corpId,createUser,userName);
+	public ServiceProject calculateServiceCharge(String tenantId, String year, Long corpId, Long createUser, String userName) {
+		return serviceProjectItemMapper.calculateServiceCharge(tenantId, year, corpId, createUser, userName);
 	}
 
 	@Override
-	public List<ServiceProject> statisticalAnalysisOutData(String tenantId, Long year, Long corpId)
-	{
-		return serviceProjectItemMapper.statisticalAnalysisOutData(tenantId,year,corpId);
+	public List<ServiceProject> statisticalAnalysisOutData(String tenantId, Long year, Long corpId) {
+		return serviceProjectItemMapper.statisticalAnalysisOutData(tenantId, year, corpId);
 	}
 
 	@Override
@@ -538,19 +470,98 @@ public class ServiceProjectServiceImpl extends ServiceImpl<ServiceProjectMapper,
 		return serviceProjectItemMapper.inactiveCorpList(tenantId, beginTime, endTime);
 	}
 
-	public void checkMoney(Long serviceId,List<ServiceProjectItem> items)
-	{
+	/**
+	 * 派工接口
+	 *
+	 * @param serviceProject
+	 * @return
+	 */
+	@Override
+	public int dispatch(ServiceProject serviceProject) {
+		List<ServiceProjectItem> itemList = serviceProject.getItemList();
+		Date date = new Date();
+		itemList.forEach(ls -> {
+			if (ObjectUtils.isNotNull(ls.getFrequency())) {
+				if (ObjectUtils.isNull(ls.getSecond())) {
+					ls.setSecond(1);
+				}
+				switch (ls.getFrequency()) {
+					case "1"://年
+						//服务费每月需缴纳
+						BigDecimal serviceCharge = ls.getServiceCharge().divide(new BigDecimal(ls.getSecond() * 12));
+						//合计金额每月需缴纳
+						BigDecimal amount = ls.getAmount().divide(new BigDecimal(ls.getSecond() * 12));
+						//成本每月需缴纳
+						BigDecimal matMoney = ls.getMatMoney().divide(new BigDecimal(ls.getSecond() * 12));
+						for (int i = 0; i < ls.getSecond() * 12; i++) {
+							//获取需求开始日期
+							Calendar calendar = Calendar.getInstance();
+							calendar.setTime(ls.getBeginTime());
+							calendar.add(Calendar.MONTH, i);//设置月分
+							calendar.set(Calendar.DAY_OF_MONTH, 1);// 设置为1号,当前日期既为本月第一天
+							Date date1 = calendar.getTime();
+
+							//获取提醒日期
+							Calendar reminderCalendar = Calendar.getInstance();
+							Date reminderDate;
+							//判断提醒日期是否为空  空默认每月一日为提醒日期  否则 每月提醒日期为当前日
+							if (ObjectUtils.isNotNull(ls.getReminderDay())) {
+								reminderCalendar.setTime(ls.getReminderDay());
+								calendar.add(Calendar.MONTH, i);//设置月分
+								reminderDate = calendar.getTime();
+							} else {
+								calendar.setTime(date);
+								calendar.add(Calendar.MONTH, i);//设置月分
+								calendar.set(Calendar.DAY_OF_MONTH, 1);// 设置为1号,当前日期既为本月第一天
+								reminderDate = calendar.getTime();
+							}
+
+							ls.setServiceCharge(serviceCharge);
+							ls.setAmount(amount);
+							ls.setMatMoney(matMoney);
+							ls.setBeginTime(date1);
+							ls.setReminderDay(reminderDate);
+
+						}
+
+					case "2"://半年
+						for (int i = 0; i < ls.getSecond() * 6; i++) {
+
+						}
+
+					case "3"://季度
+						for (int i = 0; i < ls.getSecond() * 3; i++) {
+
+						}
+
+					case "4"://月
+						for (int i = 0; i < ls.getSecond() * 1; i++) {
+
+						}
+
+					case "5"://次
+						for (int i = 0; i < ls.getSecond(); i++) {
+
+						}
+				}
+			}
+		});
+
+
+		return 0;
+	}
+
+	public void checkMoney(Long serviceId, List<ServiceProjectItem> items) {
 		ServiceProject serviceProject = serviceProjectMapper.selectById(serviceId);
 		//合同金额
 		BigDecimal debitAmount = serviceProject.getDebitAmount();
-        //子项总金额
+		//子项总金额
 		BigDecimal decimal = items.stream()
 			.filter(it -> it.getAmount() != null)
 			.map(ServiceProjectItem::getAmount)
 			.reduce(BigDecimal.ZERO, BigDecimal::add);
-        if(decimal.compareTo(debitAmount)==1)
-        {
-          throw new RuntimeException("操作失败,明细总金额大于合同金额");
+		if (decimal.compareTo(debitAmount) == 1) {
+			throw new RuntimeException("操作失败,明细总金额大于合同金额");
 		}
 	}
 

+ 33 - 0
blade-service/trade-purchase/src/main/java/com/trade/purchase/extra/controller/LeadsController.java

@@ -90,6 +90,16 @@ public class LeadsController extends BladeController {
 	}
 
 	/**
+	 * 新增 销售机会表(请核)
+	 */
+	@PostMapping("/saveExamine")
+	@ApiOperationSupport(order = 4)
+	@ApiOperation(value = "新增", notes = "传入leads")
+	public R saveExamine(@Valid @RequestBody Leads leads) {
+		return R.data(leadsService.saveExamine(leads));
+	}
+
+	/**
 	 * 修改 销售机会表
 	 */
 	@PostMapping("/update")
@@ -120,5 +130,28 @@ public class LeadsController extends BladeController {
 		return R.status(leadsService.removeLeads(Func.toLongList(ids)));
 	}
 
+	/**
+	 * 审批通过
+	 */
+	@PostMapping("/leadsPassCheck")
+	@ApiOperationSupport(order = 8)
+	@ApiOperation(value = "审批通过", notes = "传入id")
+	public R leadsPassCheck(@RequestParam(name = "id", required = true) Long id) {
+		leadsService.leadsPassCheck(id);
+		return R.success("操作成功");
+	}
+
+	/**
+	 * 审批不通过
+	 */
+	@PostMapping("/leadsPassCancel")
+	@ApiOperationSupport(order = 8)
+	@ApiOperation(value = "审批不通过", notes = "传入id")
+	public R leadsPassCancel(@RequestParam(name = "id", required = true) Long id) {
+		leadsService.leadsPassCancel(id);
+		return R.success("操作成功");
+	}
+
+
 
 }

+ 3 - 0
blade-service/trade-purchase/src/main/java/com/trade/purchase/extra/mapper/LeadsItemMapper.xml

@@ -20,6 +20,9 @@
         <result column="update_user" property="updateUser"/>
         <result column="update_time" property="updateTime"/>
         <result column="is_deleted" property="isDeleted"/>
+        <result column="sp_id" property="spId"/>
+        <result column="service_project_name" property="serviceProjectName"/>
+        <result column="charge_proposal" property="chargeProposal"/>
     </resultMap>
 
 

+ 2 - 0
blade-service/trade-purchase/src/main/java/com/trade/purchase/extra/mapper/LeadsMapper.xml

@@ -20,6 +20,8 @@
         <result column="update_user" property="updateUser"/>
         <result column="update_time" property="updateTime"/>
         <result column="is_deleted" property="isDeleted"/>
+        <result column="approval_status" property="approvalStatus"/>
+        <result column="corp_id" property="corpId"/>
     </resultMap>
 
 

+ 17 - 0
blade-service/trade-purchase/src/main/java/com/trade/purchase/extra/service/ILeadsService.java

@@ -21,6 +21,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.trade.purchase.extra.entity.Leads;
 import com.trade.purchase.extra.vo.LeadsVO;
 import org.springblade.core.mp.support.Query;
+import org.springblade.core.tool.api.R;
 
 import java.util.List;
 
@@ -74,4 +75,20 @@ public interface ILeadsService extends IService<Leads> {
 	 */
 	boolean removeLeads(List<Long> idList);
 
+	/**
+	 * 新增 销售机会表(请核)
+	 * @param leads
+	 * @return
+	 */
+	R saveExamine(Leads leads);
+
+	/**
+	 * 审批通过
+	 * @param id
+	 */
+    void leadsPassCheck(Long id);
+	/**
+	 * 审批不通过
+	 */
+	void leadsPassCancel(Long id);
 }

+ 123 - 0
blade-service/trade-purchase/src/main/java/com/trade/purchase/extra/service/impl/LeadsServiceImpl.java

@@ -18,7 +18,9 @@ package com.trade.purchase.extra.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.mysql.cj.util.StringUtils;
 import com.trade.purchase.extra.entity.Leads;
 import com.trade.purchase.extra.entity.LeadsItem;
 import com.trade.purchase.extra.mapper.LeadsItemMapper;
@@ -26,10 +28,19 @@ import com.trade.purchase.extra.mapper.LeadsMapper;
 import com.trade.purchase.extra.service.ILeadsService;
 import com.trade.purchase.extra.vo.LeadsVO;
 import lombok.AllArgsConstructor;
+import org.springblade.check.dto.AuditProecessDTO;
+import org.springblade.check.entity.AuditPathsActs;
+import org.springblade.check.entity.AuditPathsLevels;
+import org.springblade.check.entity.AuditProecess;
+import org.springblade.check.feign.ICheckClient;
+import org.springblade.client.entity.CorpsDesc;
+import org.springblade.client.feign.ICorpsDescClient;
+import org.springblade.client.feign.IGoodsDescClient;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.ObjectUtil;
 import org.springblade.core.tool.utils.StringUtil;
 import org.springblade.system.user.entity.User;
@@ -54,6 +65,12 @@ public class LeadsServiceImpl extends ServiceImpl<LeadsMapper, Leads> implements
 
 	private final IUserClient userClient;
 
+	private final IGoodsDescClient goodsDescClient;
+
+	private final ICheckClient iCheckClient;
+
+	private final ICorpsDescClient corpsDescClient;
+
 	@Override
 	public IPage<LeadsVO> selectLeadsPage(IPage<LeadsVO> page, LeadsVO leads) {
 		return page.setRecords(baseMapper.selectLeadsPage(page, leads));
@@ -71,6 +88,9 @@ public class LeadsServiceImpl extends ServiceImpl<LeadsMapper, Leads> implements
 				if (ObjectUtil.isNotEmpty(item.getBizUser())) {
 					item.setBizUserName(getUserName(item.getBizUser()));
 				}
+				if (ObjectUtil.isNotEmpty(item.getSpId())) {
+					item.setServiceProjectName(goodsDescClient.getGoodsDescDetail(item.getSpId()) == null ? "无" : goodsDescClient.getGoodsDescDetail(item.getSpId()).getCname());
+				}
 			});
 			detail.setItemList(itemList);
 		}
@@ -104,6 +124,16 @@ public class LeadsServiceImpl extends ServiceImpl<LeadsMapper, Leads> implements
 	@Override
 	@Transactional(rollbackFor = Exception.class)
 	public Long saveLeads(Leads leads) {
+
+		R<CorpsDesc> corpsDescR = corpsDescClient.getCorpByName(leads.getCorpName(),AuthUtil.getTenantId());
+		if (ObjectUtils.isNull(corpsDescR.getData())){
+			CorpsDesc corpsDesc = new CorpsDesc();
+			corpsDesc.setCname(leads.getCorpName());
+			corpsDesc.setCorpType("KH");
+			corpsDescClient.insertCorp(corpsDesc);
+			leads.setCorpId(corpsDesc.getId());
+;		}
+
 		if (ObjectUtil.isEmpty(leads.getId())) {
 			leads.setTenantId(AuthUtil.getTenantId());
 			leads.setCreateUser(AuthUtil.getUserId());
@@ -148,6 +178,99 @@ public class LeadsServiceImpl extends ServiceImpl<LeadsMapper, Leads> implements
 		return true;
 	}
 
+	/**
+	 * 新增 销售机会表(请核)
+	 *
+	 * @param leads
+	 * @return
+	 */
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public R saveExamine(Leads leads) {
+		if (ObjectUtil.isNotEmpty(leads.getId())){
+			Leads leads1 = baseMapper.selectById(leads.getId());
+			if(leads1==null)
+			{
+				throw new SecurityException("清核失败:该销售机会不存在或已被删除");
+			}
+			if(ObjectUtils.isNotNull(leads.getApprovalStatus()) && "S".equals(leads.getApprovalStatus()) || "A".equals(leads.getApprovalStatus()))
+			{
+				throw new SecurityException("清核失败:该销售机会已开启审批,禁止重复提交");
+			}
+		}else{
+			throw new SecurityException("操作失败,请联系管理员");
+		}
+
+		//todo 查看是否开启审批流,如果已经开启了,走审批流,反之直接走审批通过接口
+		AuditPathsActs pathsActs = iCheckClient.getActsByActId(1, "approval_status");
+
+		//没开启审批流直接走 通过流程
+		if(pathsActs==null || pathsActs.getIsEnable()==2)
+		{
+			this.saveLeads(leads);
+		}
+		//走审批流
+		else
+		{
+			//获取审批级次
+			List<AuditPathsLevels> auditPathsLevels = iCheckClient.listLevelsByActId(1, "approval_status");
+			AuditProecessDTO auditProecessDTO=new AuditProecessDTO();
+			//追加跳转路由url
+			auditProecessDTO.setUrl(leads.getUrl());
+			auditProecessDTO.setPageStatus(leads.getPageStatus());
+			auditProecessDTO.setPageLabel(leads.getPageLabel());
+			auditProecessDTO.setCheckType(leads.getCheckType());
+			//增加审批类型
+			auditProecessDTO.setProcessType("销售机会审批");
+			auditProecessDTO.setPathsLevelsList(auditPathsLevels);
+			auditProecessDTO.setActId(1);
+			auditProecessDTO.setSrcBillId(leads.getId());
+			auditProecessDTO.setBillId(leads.getId());
+			auditProecessDTO.setBillNo(leads.getId()+"");
+			auditProecessDTO.setSendUserId(AuthUtil.getUserId());
+			auditProecessDTO.setSendName(AuthUtil.getUserName());
+			auditProecessDTO.setSendTime(new Date());
+			R ServiceProcess = iCheckClient.createFinanceProcess(auditProecessDTO);
+			if(!ServiceProcess.isSuccess())
+			{
+				throw new SecurityException("操作失败,请联系管理员");
+			}
+			leads.setApprovalStatus("S");
+			baseMapper.updateById(leads);
+		}
+		return R.success("请核成功");
+	}
+	/**
+	 * 审批通过
+	 * @param id
+	 */
+	@Override
+	@Transactional
+	public void leadsPassCheck(Long id) {
+		Leads leads = baseMapper.selectById(id);
+		if(leads==null)
+		{
+			throw new SecurityException("操作失败:未查询到主营项目数据");
+		}
+		leads.setApprovalStatus("A");
+		leads.setStatus(1);
+		baseMapper.updateById(leads);
+	}
+	/**
+	 * 审批不通过
+	 */
+	@Override
+	@Transactional
+	public void leadsPassCancel(Long id) {
+		Leads leads = baseMapper.selectById(id);
+		if(leads==null)
+		{
+			throw new SecurityException("操作失败:未查询到主营项目数据");
+		}
+		leads.setApprovalStatus("B");
+		baseMapper.updateById(leads);
+	}
+
 	private String getUserName(Long userId) {
 		R<User> user = userClient.userInfoById(userId);
 		if (user.isSuccess() && ObjectUtil.isNotEmpty(user.getData())) {

+ 36 - 0
blade-service/trade-purchase/src/main/java/com/trade/purchase/feign/leadsClient.java

@@ -0,0 +1,36 @@
+package com.trade.purchase.feign;
+
+import com.trade.purchase.extra.feign.ILeadsClient;
+import com.trade.purchase.extra.service.ILeadsService;
+import lombok.AllArgsConstructor;
+import org.springblade.core.tenant.annotation.NonDS;
+import org.springblade.core.tool.api.R;
+import org.springframework.web.bind.annotation.RestController;
+import springfox.documentation.annotations.ApiIgnore;
+
+@NonDS
+@ApiIgnore()
+@RestController
+@AllArgsConstructor
+public class leadsClient implements ILeadsClient {
+
+	private final ILeadsService leadsService;
+
+
+	@Override
+	public R leadsPassCheck(Long id) {
+		leadsService.leadsPassCheck(id);
+		return R.success("操作成功");
+	}
+
+	@Override
+	public R leadsPassCancel(Long id) {
+		leadsService.leadsPassCancel(id);
+		return R.success("操作成功");
+	}
+
+	@Override
+	public R underReview(Long id) {
+		return null;
+	}
+}

+ 1 - 1
blade-service/trade-purchase/src/main/java/com/trade/purchase/order/mapper/OrderItemsMapper.xml

@@ -90,7 +90,7 @@
         business_order a,
         business_order_items b
         WHERE
-        a.id = b.pidc
+        a.id = b.pid
         and b.order_quantity>b.actual_quantity
         and a.bill_type='CG'
         and a.trade_type=#{tradeType}