Browse Source

Merge remote-tracking branch 'origin/master'

home 2 năm trước cách đây
mục cha
commit
2f0db5379b
15 tập tin đã thay đổi với 423 bổ sung44 xóa
  1. 56 0
      hx-common/service-flow/src/main/java/com/fjhx/feign/FlowClient.java
  2. 19 0
      hx-service-api/service-flow-api/src/main/java/com/fjhx/feign/IFlowClient.java
  3. 8 2
      hx-service-api/service-flow-api/src/main/java/com/fjhx/utils/ExampleAbstract.java
  4. 14 0
      hx-service-api/service-flow-api/src/main/java/com/fjhx/utils/FlowConstructor.java
  5. 1 1
      hx-service-api/victoriatourist-api/src/main/java/com/fjhx/entity/purchase/Purchase.java
  6. 1 1
      hx-service-api/victoriatourist-api/src/main/java/com/fjhx/params/purchase/PurchaseEx.java
  7. 7 1
      hx-service-api/victoriatourist-api/src/main/java/com/fjhx/params/purchase/PurchaseVo.java
  8. 12 0
      hx-service/victoriatourist/src/main/java/com/fjhx/controller/purchase/PurchaseFlowController.java
  9. 8 0
      hx-service/victoriatourist/src/main/java/com/fjhx/service/apply/ApplyPurchaseService.java
  10. 79 17
      hx-service/victoriatourist/src/main/java/com/fjhx/service/apply/impl/ApplyPurchaseServiceImpl.java
  11. 8 0
      hx-service/victoriatourist/src/main/java/com/fjhx/service/purchase/PurchaseFlowService.java
  12. 8 0
      hx-service/victoriatourist/src/main/java/com/fjhx/service/purchase/PurchaseService.java
  13. 121 20
      hx-service/victoriatourist/src/main/java/com/fjhx/service/purchase/impl/PurchaseFlowServiceImpl.java
  14. 27 2
      hx-service/victoriatourist/src/main/java/com/fjhx/service/purchase/impl/PurchaseServiceImpl.java
  15. 54 0
      hx-service/victoriatourist/src/main/java/com/fjhx/uitl/flow/FlowUserUtil.java

+ 56 - 0
hx-common/service-flow/src/main/java/com/fjhx/feign/FlowClient.java

@@ -1,6 +1,8 @@
 package com.fjhx.feign;
 
 import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.fjhx.base.BaseEntity;
 import com.fjhx.constants.FlowConstant;
@@ -26,6 +28,7 @@ import com.fjhx.service.process.ProcessTenantService;
 import com.fjhx.utils.Assert;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.Func;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -317,4 +320,57 @@ public class FlowClient implements IFlowClient {
         return exampleDetails;
     }
 
+    /**
+     * 根据流程实例ID删除流程(伪删除)
+     *
+     * @param exampleInfoId 流程实例ID
+     * @return
+     */
+    @Transactional(rollbackFor = {Exception.class})
+    @Override
+    public Boolean deleteByExampleInfoId(Long exampleInfoId) {
+        Boolean flag = true;
+        try {
+            //流程实例
+            UpdateWrapper<ExampleInfo> exampleInfoWrapper = new UpdateWrapper<>();
+            exampleInfoWrapper.lambda().set(ExampleInfo::getDelFlag, 1);
+            exampleInfoWrapper.lambda().eq(ExampleInfo::getId, exampleInfoId);
+            exampleInfoService.update(exampleInfoWrapper);
+
+            //实例明细
+            UpdateWrapper<ExampleDetails> exampleDetailsWrapper = new UpdateWrapper<>();
+            exampleDetailsWrapper.lambda().set(ExampleDetails::getDelFlag, 1);
+            exampleDetailsWrapper.lambda().eq(ExampleDetails::getExampleInfoId, exampleInfoId);
+            exampleDetailsService.update(exampleDetailsWrapper);
+        } catch (Exception e) {
+            flag = false;
+            e.printStackTrace();
+            throw e;
+        } finally {
+            return flag;
+        }
+    }
+
+    /**
+     * 获取当前节点对应的按钮ID
+     *
+     * @param exampleInfoId 流程实例ID
+     * @return
+     */
+    @Override
+    public Long getButtonIdByExampleInfoId(Long exampleInfoId) {
+        Long buttonId = null;
+        //查询流程实例信息
+        ExampleInfo exampleInfo = exampleInfoService.getById(exampleInfoId);
+        if (Func.isNotEmpty(exampleInfo)) {
+            //查询节点按钮信息
+            QueryWrapper<ProcessNodeButton> wrapper = new QueryWrapper<>();
+            wrapper.lambda().eq(ProcessNodeButton::getProcessNodeId, exampleInfo.getProcessNodeId());
+            ProcessNodeButton button = processNodeButtonService.getOne(wrapper);
+            if (Func.isNotEmpty(button)) {
+                buttonId = button.getId();
+            }
+        }
+        return buttonId;
+    }
 }

+ 19 - 0
hx-service-api/service-flow-api/src/main/java/com/fjhx/feign/IFlowClient.java

@@ -22,6 +22,8 @@ public interface IFlowClient {
     String ROLL_BACK = ClientConstant.API_PREFIX + "/rollBack";
     String WITHDRAW = ClientConstant.API_PREFIX + "/withdraw";
     String REVOKE = ClientConstant.API_PREFIX + "/revoke";
+    String DELETE_BY_EXAMPLE_INFO_ID = ClientConstant.API_PREFIX + "/deleteByExampleInfoId";
+    String GET_BUTTON_ID_BY_EXAMPLE_INFO_ID = ClientConstant.API_PREFIX + "/getButtonIdByExampleInfoId";
 
     /**
      * 创建流程
@@ -75,4 +77,21 @@ public interface IFlowClient {
     @PostMapping(REVOKE)
     R revoke(@RequestParam(value = "revokeExampleInfoId", required = false) Long revokeExampleInfoId);
 
+    /**
+     * 根据流程实例ID删除流程(伪删除)
+     *
+     * @param exampleInfoId 流程实例ID
+     * @return
+     */
+    @PostMapping(DELETE_BY_EXAMPLE_INFO_ID)
+    Boolean deleteByExampleInfoId(@RequestParam("exampleInfoId") Long exampleInfoId);
+
+    /**
+     * 获取当前节点对应的按钮ID
+     *
+     * @param exampleInfoId 流程实例ID
+     * @return
+     */
+    @PostMapping(GET_BUTTON_ID_BY_EXAMPLE_INFO_ID)
+    Long getButtonIdByExampleInfoId(@RequestParam("exampleInfoId") Long exampleInfoId);
 }

+ 8 - 2
hx-service-api/service-flow-api/src/main/java/com/fjhx/utils/ExampleAbstract.java

@@ -68,6 +68,12 @@ public abstract class ExampleAbstract {
         return null;
     }
 
-
-
+    /**
+     * 删除流程
+     *
+     * @return
+     */
+    public boolean deleteLogic() {
+        return true;
+    }
 }

+ 14 - 0
hx-service-api/service-flow-api/src/main/java/com/fjhx/utils/FlowConstructor.java

@@ -197,4 +197,18 @@ public class FlowConstructor {
         return code;
     }
 
+    /**
+     * 删除流程
+     *
+     * @param exampleInfoId 流程实例ID
+     * @return
+     */
+    public boolean deleteLogic(Long exampleInfoId) {
+        //根据流程实例ID删除流程(伪删除)
+        Boolean flag = flowClient.deleteByExampleInfoId(exampleInfoId);
+        if (flag) {
+            flag = exampleAbstract.deleteLogic();
+        }
+        return flag;
+    }
 }

+ 1 - 1
hx-service-api/victoriatourist-api/src/main/java/com/fjhx/entity/purchase/Purchase.java

@@ -34,7 +34,7 @@ public class Purchase extends BaseEntity {
     private String code;
 
     /**
-     * 订单金额
+     * 采购金额
      */
     private BigDecimal price;
 

+ 1 - 1
hx-service-api/victoriatourist-api/src/main/java/com/fjhx/params/purchase/PurchaseEx.java

@@ -5,7 +5,7 @@ import lombok.Data;
 import lombok.EqualsAndHashCode;
 
 /**
- * 订单
+ * 采购
  *
  * @author ${author}
  * @since 2022-12-01

+ 7 - 1
hx-service-api/victoriatourist-api/src/main/java/com/fjhx/params/purchase/PurchaseVo.java

@@ -9,7 +9,7 @@ import lombok.EqualsAndHashCode;
 import java.util.List;
 
 /**
- * 订单
+ * 采购
  *
  * @author ${author}
  * @since 2022-12-01
@@ -19,6 +19,12 @@ import java.util.List;
 public class PurchaseVo extends Purchase {
 
     /**
+     * 按钮ID
+     */
+    @TableField(exist = false)
+    private Long buttonId;
+
+    /**
      * 办理说明
      */
     @TableField(exist = false)

+ 12 - 0
hx-service/victoriatourist/src/main/java/com/fjhx/controller/purchase/PurchaseFlowController.java

@@ -47,5 +47,17 @@ public class PurchaseFlowController {
         purchaseFlowService.examine(entity);
         return R.success();
     }
+
+    /**
+     * 详情
+     *
+     * @param entity
+     * @return
+     */
+    @PostMapping(value = "/details")
+    public R details(@RequestBody PurchaseVo entity) {
+        purchaseFlowService.details(entity);
+        return R.success();
+    }
 }
 

+ 8 - 0
hx-service/victoriatourist/src/main/java/com/fjhx/service/apply/ApplyPurchaseService.java

@@ -39,4 +39,12 @@ public interface ApplyPurchaseService extends BaseService<ApplyPurchase> {
      * @return
      */
     Page<ApplyPurchase> stayPurchasePage(Map<String, Object> condition);
+
+    /**
+     * 根据采购ID查询
+     *
+     * @param purchaseId 采购ID
+     * @return
+     */
+    List<ApplyPurchase> getByPurchaseId(Long purchaseId);
 }

+ 79 - 17
hx-service/victoriatourist/src/main/java/com/fjhx/service/apply/impl/ApplyPurchaseServiceImpl.java

@@ -29,10 +29,13 @@ import org.springframework.stereotype.Service;
 import java.io.Serializable;
 import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
+import java.util.Arrays;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 /**
@@ -165,6 +168,10 @@ public class ApplyPurchaseServiceImpl extends ServiceImpl<ApplyPurchaseMapper, A
                 purchase.setGoodsUnit(info.getUnit());
             }
 
+            //物品出库信息map
+            Map<Long, BigDecimal> outStockMap = getOutStockMap(Arrays.asList(purchase.getGoodsId()));
+            purchase.setOutStockQuantity(Optional.ofNullable(outStockMap.get(purchase.getGoodsId())).orElse(new BigDecimal(BigDecimal.ZERO.intValue())));
+
             //查询库存
             Stock stock = stockService.lambdaQuery().eq(Stock::getWarehouseId, purchase.getReceiptWarehouseId()).eq(Stock::getGoodsId, purchase.getGoodsId()).one();
             if (Func.isNotEmpty(stock)) {
@@ -199,24 +206,8 @@ public class ApplyPurchaseServiceImpl extends ServiceImpl<ApplyPurchaseMapper, A
         if (Func.isNotEmpty(page.getRecords())) {
             //物品ID集合
             List<Long> goodsIds = page.getRecords().stream().map(ApplyPurchase::getGoodsId).distinct().collect(Collectors.toList());
-            //结束时间
-            Date endTime = new Date();
-            //开始时间:往前推移30天
-            Date startTime = DateUtil.plusDays(endTime, -30l);
             //物品出库信息map
-            Map<Long, BigDecimal> outStockMap = new HashMap<>();
-            //查询出库信息
-            List<StockJournal> stockJournals = stockJournalService.query()
-                    .select("goods_id, SUM(change_quantity) change_quantity")
-                    .eq("`type`", StockJournalTypeConstant.OUT)
-                    .in("goods_id", goodsIds)
-                    .apply("DATE_FORMAT(create_time, '%Y-%m-%d') >= '" + new SimpleDateFormat("yyyy-MM-dd").format(startTime) + "'")
-                    .apply("DATE_FORMAT(create_time, '%Y-%m-%d') <= '" + new SimpleDateFormat("yyyy-MM-dd").format(endTime) + "'")
-                    .groupBy("goods_id")
-                    .list();
-            if (Func.isNotEmpty(stockJournals)) {
-                outStockMap = stockJournals.stream().collect(Collectors.toMap(StockJournal::getGoodsId, StockJournal::getChangeQuantity, (key1, key2) -> key2));
-            }
+            Map<Long, BigDecimal> outStockMap = getOutStockMap(goodsIds);
 
             //用户信息map
             Map<Long, String> userNameMap = UserClientUtil.getUserNameMap(page.getRecords(), ApplyPurchase::getCreateUser);
@@ -233,4 +224,75 @@ public class ApplyPurchaseServiceImpl extends ServiceImpl<ApplyPurchaseMapper, A
 
         return page;
     }
+
+    /**
+     * 获取物品出库信息
+     *
+     * @param goodsIds 物品ID集合
+     * @return
+     */
+    private Map<Long, BigDecimal> getOutStockMap(List<Long> goodsIds) {
+        //物品出库信息map
+        Map<Long, BigDecimal> outStockMap = new HashMap<>();
+        //结束时间
+        Date endTime = new Date();
+        //开始时间:往前推移30天
+        Date startTime = DateUtil.plusDays(endTime, -30l);
+
+        //查询出库信息
+        List<StockJournal> stockJournals = stockJournalService.query()
+                .select("goods_id, SUM(change_quantity) change_quantity")
+                .eq("`type`", StockJournalTypeConstant.OUT)
+                .in("goods_id", goodsIds)
+                .apply("DATE_FORMAT(create_time, '%Y-%m-%d') >= '" + new SimpleDateFormat("yyyy-MM-dd").format(startTime) + "'")
+                .apply("DATE_FORMAT(create_time, '%Y-%m-%d') <= '" + new SimpleDateFormat("yyyy-MM-dd").format(endTime) + "'")
+                .groupBy("goods_id")
+                .list();
+        if (Func.isNotEmpty(stockJournals)) {
+            outStockMap = stockJournals.stream().collect(Collectors.toMap(StockJournal::getGoodsId, StockJournal::getChangeQuantity, (key1, key2) -> key2));
+        }
+
+        return outStockMap;
+    }
+
+    /**
+     * 根据采购ID查询
+     *
+     * @param purchaseId 采购ID
+     * @return
+     */
+    @Override
+    public List<ApplyPurchase> getByPurchaseId(Long purchaseId) {
+
+        List<ApplyPurchase> purchases = lambdaQuery().eq(ApplyPurchase::getPurchaseId, purchaseId).list();
+        if (Func.isNotEmpty(purchases)) {
+            //物品ID集合
+            List<Long> goodsIds = purchases.stream().map(ApplyPurchase::getGoodsId).distinct().collect(Collectors.toList());
+
+            //物品信息map
+            Map<Long, ProductInfo> productInfoMap = new HashMap<>();
+            //查询物品信息
+            List<ProductInfo> productInfos = productInfoService.lambdaQuery().in(ProductInfo::getId, goodsIds).list();
+            if (Func.isNotEmpty(productInfos)) {
+                productInfoMap = productInfos.stream().collect(Collectors.toMap(ProductInfo::getId, Function.identity(), (key1, key2) -> key2));
+            }
+
+            //物品出库信息map
+            Map<Long, BigDecimal> outStockMap = getOutStockMap(goodsIds);
+
+            for (ApplyPurchase record : purchases) {
+                if (Func.isNotEmpty(productInfoMap) && Func.isNotEmpty(productInfoMap.get(record.getGoodsId()))) {
+                    ProductInfo info = productInfoMap.get(record.getGoodsId());
+                    record.setGoodsType(info.getType());
+                    record.setGoodsCode(info.getCode());
+                    record.setGoodsName(info.getName());
+                    record.setGoodsUnit(info.getUnit());
+                }
+                if (Func.isNotEmpty(outStockMap) && Func.isNotEmpty(outStockMap.get(record.getGoodsId()))) {
+                    record.setOutStockQuantity(outStockMap.get(record.getGoodsId()));
+                }
+            }
+        }
+        return purchases;
+    }
 }

+ 8 - 0
hx-service/victoriatourist/src/main/java/com/fjhx/service/purchase/PurchaseFlowService.java

@@ -1,5 +1,6 @@
 package com.fjhx.service.purchase;
 
+import com.fjhx.entity.purchase.Purchase;
 import com.fjhx.params.purchase.PurchaseVo;
 
 /**
@@ -28,4 +29,11 @@ public interface PurchaseFlowService {
      */
     void examine(PurchaseVo entity);
 
+    /**
+     * 详情
+     *
+     * @param entity
+     * @return
+     */
+    Purchase details(PurchaseVo entity);
 }

+ 8 - 0
hx-service/victoriatourist/src/main/java/com/fjhx/service/purchase/PurchaseService.java

@@ -33,4 +33,12 @@ public interface PurchaseService extends BaseService<Purchase> {
      * @return
      */
     Page<ApplyPurchase> stayPurchasePage(Map<String, Object> condition);
+
+    /**
+     * 获取审批详情
+     *
+     * @param id 采购ID
+     * @return
+     */
+    Purchase getFlowDetailsById(Long id);
 }

+ 121 - 20
hx-service/victoriatourist/src/main/java/com/fjhx/service/purchase/impl/PurchaseFlowServiceImpl.java

@@ -4,13 +4,18 @@ import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.fjhx.entity.apply.ApplyPurchase;
 import com.fjhx.entity.purchase.Purchase;
+import com.fjhx.enums.apply.ApplyPurchaseStatusEnum;
 import com.fjhx.enums.flow.FlowCodeEnum;
 import com.fjhx.enums.purchase.PurchaseStatusEnum;
+import com.fjhx.feign.IFlowClient;
 import com.fjhx.params.ExampleResult;
 import com.fjhx.params.purchase.PurchaseVo;
+import com.fjhx.service.apply.ApplyPurchaseService;
 import com.fjhx.service.purchase.PurchaseFlowService;
 import com.fjhx.service.purchase.PurchaseService;
 import com.fjhx.uitl.code.CodeEnum;
+import com.fjhx.uitl.flow.FlowUserUtil;
+import com.fjhx.utils.BigDecimalUtil;
 import com.fjhx.utils.ExampleAbstract;
 import com.fjhx.utils.FlowConstructor;
 import org.springblade.core.log.exception.ServiceException;
@@ -21,6 +26,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.util.List;
 
@@ -39,8 +45,14 @@ public class PurchaseFlowServiceImpl implements PurchaseFlowService {
     private PurchaseService purchaseService;
 
     @Autowired
+    private ApplyPurchaseService applyPurchaseService;
+
+    @Autowired
     private RedisLockClient redisLockClient;
 
+    @Autowired
+    private IFlowClient iFlowClient;
+
     private final String REDIS_LOCK_CACHE_KEY = "seq:lock:" + AuthUtil.getTenantId() + ":purchase:";
 
     /**
@@ -63,6 +75,44 @@ public class PurchaseFlowServiceImpl implements PurchaseFlowService {
                     @Transactional(rollbackFor = {Exception.class})
                     @Override
                     public void end() {
+                        Long id = getCacheData(Long.class);
+                        //修改采购状态
+                        purchaseService.lambdaUpdate().set(Purchase::getStatus, PurchaseStatusEnum.STATUS_30.getKey()).eq(Purchase::getId, id).update();
+                        //修改申购状态
+                        applyPurchaseService.lambdaUpdate().set(ApplyPurchase::getStatus, ApplyPurchaseStatusEnum.STATUS_30.getKey()).eq(ApplyPurchase::getPurchaseId, id).update();
+                    }
+
+                    /**
+                     * 驳回
+                     *
+                     */
+                    @Transactional(rollbackFor = {Exception.class})
+                    @Override
+                    public void reject() {
+                        Purchase purchase = purchaseService.getById(getCacheData(Long.class));
+                        flowConstructor().deleteLogic(purchase.getFlowId());
+                    }
+
+                    /**
+                     * 删除流程
+                     *
+                     * @return
+                     */
+                    @Transactional(rollbackFor = {Exception.class})
+                    @Override
+                    public boolean deleteLogic() {
+                        Long id = getCacheData(Long.class);
+                        //修改采购状态
+                        purchaseService.lambdaUpdate().set(Purchase::getStatus, PurchaseStatusEnum.STATUS_20.getKey()).set(Purchase::getDelFlag, 1).eq(Purchase::getId, id).update();
+                        //修改申购状态
+                        applyPurchaseService.lambdaUpdate()
+                                .set(ApplyPurchase::getStatus, ApplyPurchaseStatusEnum.STATUS_10.getKey())
+                                .set(ApplyPurchase::getUnitPrice, null)
+                                .set(ApplyPurchase::getPurchaseId, null)
+                                .set(ApplyPurchase::getPurchaseCode, null)
+                                .eq(ApplyPurchase::getPurchaseId, id)
+                                .update();
+                        return true;
                     }
                 }
         );
@@ -78,33 +128,56 @@ public class PurchaseFlowServiceImpl implements PurchaseFlowService {
     @Override
     public void start(PurchaseVo entity) {
         if (!redisLockClient.lockFair(REDIS_LOCK_CACHE_KEY, () -> {
-            entity.setId(IdWorker.getId());
+            if (Func.isEmpty(entity.getId())) {
+                entity.setId(IdWorker.getId());
+            }
 
-            //获取编码
-            String code = CodeEnum.APPLY_PURCHASE.getCode();
-            //查询编码是否已存在
-            if (!checkCodeIsExist(null, code)) {
-                throw new ServiceException("后台自增编码存在重复,请重试或联系管理员!编码:" + code);
+            if (Func.isBlank(entity.getCode())) {
+                //获取编码
+                entity.setCode(CodeEnum.APPLY_PURCHASE.getCode());
+                //查询编码是否已存在
+                if (!checkCodeIsExist(null, entity.getCode())) {
+                    throw new ServiceException("后台自增编码存在重复,请重试或联系管理员!编码:" + entity.getCode());
+                }
             }
 
             //流程标题
-            String title = AuthUtil.getUserName() + " 在" + LocalDate.now() + "日发起了 采购审批流程(单号:" + code + ")";
-
-            ExampleResult exampleResult = flowConstructor().create(entity.getId(), title, entity.getFlowRemark(), entity.getId());
+            String title = AuthUtil.getUserName() + " 在" + LocalDate.now() + "日发起了 采购审批流程(单号:" + entity.getCode() + ")";
+
+            ExampleResult exampleResult = null;
+            if (Func.isEmpty(entity.getFlowId())) {
+                //启动流程
+                exampleResult = flowConstructor().create(entity.getId(), title, entity.getFlowRemark(), entity.getId());
+            } else {
+                //获取当前节点对应的按钮ID
+                Long buttonId = iFlowClient.getButtonIdByExampleInfoId(entity.getFlowId());
+                //审批操作(用于驳回后重新提交)
+                exampleResult = flowConstructor().jump(entity.getId(), buttonId, entity.getFlowRemark(), entity.getId());
+            }
 
             //事务回滚
+            ExampleResult finalExampleResult = exampleResult;
             exampleResult.after(() -> {
-//                //获取下一节点处理人信息
-//                JSONObject nextNodeHandleUserInfo = new JSONObject();
-//                getNextNodeHandleUserInfo(finalExampleResult, nextNodeHandleUserInfo);
-//
-//                //先删除旧数据
-//                applyPurchaseService.deleteByCode(finalApplyCode);
-//
-//                for (ApplyPurchase goods : entity.getGoodsList()) {
-//                    goods.setCode(finalApplyCode);
-//                    goods.setStatus(PurchaseStatusEnum.STATUS_10.getKey());
-//                }
+                //处理下一节点处理人信息
+                JSONObject nextNodeHandleUserInfo = new JSONObject();
+                FlowUserUtil.getNextNodeHandleUserInfo(finalExampleResult, nextNodeHandleUserInfo);
+                entity.setFlowId(nextNodeHandleUserInfo.getLong("flowId"));
+                entity.setFlowApproverId(nextNodeHandleUserInfo.getLong("flowApproverId"));
+                entity.setFlowApproverName(nextNodeHandleUserInfo.getString("flowApproverName"));
+                entity.setStatus(PurchaseStatusEnum.STATUS_10.getKey());
+                //采购金额
+                BigDecimal price = new BigDecimal(BigDecimal.ZERO.intValue());
+
+                for (ApplyPurchase goods : entity.getGoodsList()) {
+                    goods.setPurchaseId(entity.getId());
+                    goods.setPurchaseCode(entity.getCode());
+                    goods.setStatus(ApplyPurchaseStatusEnum.STATUS_20.getKey());
+                    price = price.add(BigDecimalUtil.multiply(goods.getQuantity(), goods.getUnitPrice(), 2));
+                }
+                entity.setPrice(price);
+                purchaseService.saveOrUpdate(entity);
+
+                applyPurchaseService.saveOrUpdateBatch(entity.getGoodsList());
             });
             return true;
         })) {
@@ -120,11 +193,39 @@ public class PurchaseFlowServiceImpl implements PurchaseFlowService {
      */
     @Override
     public void examine(PurchaseVo entity) {
+        Purchase purchase = purchaseService.getById(entity.getId());
+        if (Func.isEmpty(purchase)) {
+            throw new ServiceException("操作异常,业务数据不存在!");
+        }
 
+        //审批操作
+        ExampleResult exampleResult = flowConstructor().jump(entity.getId(), entity.getButtonId(), entity.getFlowRemark(), entity.getId());
+        exampleResult.after(() -> {
+            //处理下一节点处理人信息
+            JSONObject nextNodeHandleUserInfo = new JSONObject();
+            FlowUserUtil.getNextNodeHandleUserInfo(exampleResult, nextNodeHandleUserInfo);
+            entity.setFlowId(nextNodeHandleUserInfo.getLong("flowId"));
+            entity.setFlowApproverId(nextNodeHandleUserInfo.getLong("flowApproverId"));
+            entity.setFlowApproverName(nextNodeHandleUserInfo.getString("flowApproverName"));
+
+            //修改流程信息
+            purchaseService.updateById(entity);
+        });
     }
 
     private Boolean checkCodeIsExist(Long id, String code) {
         List<Purchase> list = purchaseService.lambdaQuery().ne(Func.isNotEmpty(id), Purchase::getId, id).eq(Purchase::getCode, code).list();
         return !Func.isNotEmpty(list);
     }
+
+    /**
+     * 详情
+     *
+     * @param entity
+     * @return
+     */
+    @Override
+    public Purchase details(PurchaseVo entity) {
+        return purchaseService.getFlowDetailsById(entity.getId());
+    }
 }

+ 27 - 2
hx-service/victoriatourist/src/main/java/com/fjhx/service/purchase/impl/PurchaseServiceImpl.java

@@ -1,17 +1,21 @@
 package com.fjhx.service.purchase.impl;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fjhx.entity.apply.ApplyPurchase;
 import com.fjhx.entity.purchase.Purchase;
-import com.fjhx.params.purchase.PurchaseVo;
 import com.fjhx.mapper.purchase.PurchaseMapper;
+import com.fjhx.params.purchase.PurchaseVo;
 import com.fjhx.service.apply.ApplyPurchaseService;
 import com.fjhx.service.purchase.PurchaseService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fjhx.utils.wrapperUtil.IWrapper;
+import org.springblade.core.log.exception.ServiceException;
+import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.core.tool.utils.Func;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -61,4 +65,25 @@ public class PurchaseServiceImpl extends ServiceImpl<PurchaseMapper, Purchase> i
     public Page<ApplyPurchase> stayPurchasePage(Map<String, Object> condition) {
         return applyPurchaseService.stayPurchasePage(condition);
     }
+
+    /**
+     * 获取审批详情
+     *
+     * @param id 采购ID
+     * @return
+     */
+    @Override
+    public Purchase getFlowDetailsById(Long id) {
+        Purchase purchase = getById(id);
+        if (Func.isEmpty(purchase)) {
+            throw new ServiceException("操作异常,业务数据不存在!");
+        }
+
+        //获取物品详情
+        List<ApplyPurchase> applyPurchases = applyPurchaseService.getByPurchaseId(id);
+        PurchaseVo vo = new PurchaseVo();
+        BeanUtil.copy(purchase, vo);
+        vo.setGoodsList(applyPurchases);
+        return vo;
+    }
 }

+ 54 - 0
hx-service/victoriatourist/src/main/java/com/fjhx/uitl/flow/FlowUserUtil.java

@@ -0,0 +1,54 @@
+package com.fjhx.uitl.flow;
+
+import cn.hutool.core.convert.Convert;
+import com.alibaba.fastjson.JSONObject;
+import com.fjhx.entity.example.ExampleInfo;
+import com.fjhx.enums.ProcessNodeHandleObjectTypeEnum;
+import com.fjhx.params.ExampleResult;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.Func;
+import org.springblade.core.tool.utils.SpringUtil;
+import org.springblade.system.user.entity.User;
+import org.springblade.system.user.feign.IUserClient;
+
+/**
+ * @Description:
+ * @ClassName: FlowUserUtil
+ * @Author: linqt
+ * @Date: 2022/12/1 15:32
+ * @Version: 1.0
+ */
+public class FlowUserUtil {
+
+    private static IUserClient iUserClient = SpringUtil.getBean(IUserClient.class);
+
+    /**
+     * 获取下一节点处理人信息
+     *
+     * @param exampleResult          流程信息结果对象
+     * @param nextNodeHandleUserInfo 下一节点处理人信息对象
+     */
+    public static void getNextNodeHandleUserInfo(ExampleResult exampleResult, JSONObject nextNodeHandleUserInfo) {
+        Long flowApproverId = null;
+        String flowApproverName = "";
+        //下一节点信息
+        ExampleInfo exampleInfo = exampleResult.getExampleInfo();
+        //当下一节点处理对象类型为指定用户
+        if (Func.isNotEmpty(exampleInfo.getHandleObjectType()) && Func.isNotBlank(exampleInfo.getHandleObjectIdSet()) && exampleInfo.getHandleObjectType() == ProcessNodeHandleObjectTypeEnum.USER.getType()) {
+            //下一节点处理对象ID串
+            String[] userIdArr = exampleInfo.getHandleObjectIdSet().split(",");
+            if (userIdArr.length == 1) {
+                //获取用户信息
+                R<User> byUserId = iUserClient.userInfoById(Convert.toLong(userIdArr[0]));
+                if (byUserId.isSuccess() && Func.isNotEmpty(byUserId.getData())) {
+                    User user = byUserId.getData();
+                    flowApproverId = user.getId();
+                    flowApproverName = user.getRealName();
+                }
+            }
+        }
+        nextNodeHandleUserInfo.put("flowId", exampleInfo.getId().toString());
+        nextNodeHandleUserInfo.put("flowApproverId", flowApproverId);
+        nextNodeHandleUserInfo.put("flowApproverName", flowApproverName);
+    }
+}