From 92bc6dca274eb45dc330f63b5a3f90a01458e157 Mon Sep 17 00:00:00 2001
From: zhangherong <571457620@qq.com>
Date: 星期二, 27 五月 2025 14:48:55 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/ToolsStocktakingBoundServiceImpl.java |  266 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 266 insertions(+), 0 deletions(-)

diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/ToolsStocktakingBoundServiceImpl.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/ToolsStocktakingBoundServiceImpl.java
new file mode 100644
index 0000000..d263f68
--- /dev/null
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/ToolsStocktakingBoundServiceImpl.java
@@ -0,0 +1,266 @@
+package org.jeecg.modules.tms.service.impl;
+
+
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.apache.shiro.SecurityUtils;
+import org.flowable.engine.TaskService;
+import org.flowable.task.api.Task;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.exception.JeecgBootException;
+import org.jeecg.common.system.vo.LoginUser;
+import org.jeecg.modules.flowable.apithird.business.entity.FlowMyBusiness;
+import org.jeecg.modules.flowable.apithird.business.service.IFlowMyBusinessService;
+import org.jeecg.modules.flowable.apithird.service.FlowCallBackServiceI;
+import org.jeecg.modules.flowable.apithird.service.FlowCommonService;
+import org.jeecg.modules.flowable.service.IFlowDefinitionService;
+import org.jeecg.modules.flowable.service.IFlowTaskService;
+import org.jeecg.modules.system.entity.SysUser;
+import org.jeecg.modules.system.service.ISysUserService;
+import org.jeecg.modules.tms.entity.BaseTools;
+import org.jeecg.modules.tms.entity.ToolsLossBound;
+import org.jeecg.modules.tms.entity.ToolsStocktakingBound;
+import org.jeecg.modules.tms.entity.ToolsStocktakingBoundDetail;
+import org.jeecg.modules.tms.entity.dto.LossBoundFlowDto;
+import org.jeecg.modules.tms.entity.dto.StocktakingBoundFlowDto;
+import org.jeecg.modules.tms.enums.OutBillStatus;
+import org.jeecg.modules.tms.enums.OutBoundStatusEnum;
+import org.jeecg.modules.tms.mapper.ToolsStocktakingBoundDetailMapper;
+import org.jeecg.modules.tms.mapper.ToolsStocktakingBoundMapper;
+import org.jeecg.modules.tms.service.IToolsStocktakingBoundService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.io.Serializable;
+import java.util.*;
+
+/**
+ * @Description: 鐩樼偣鍗曡〃
+ * @Author: jeecg-boot
+ * @Date: 2025-05-16
+ * @Version: V1.0
+ */
+
+@Service("IToolsStocktakingBoundService")
+public class ToolsStocktakingBoundServiceImpl extends ServiceImpl<ToolsStocktakingBoundMapper, ToolsStocktakingBound> implements IToolsStocktakingBoundService, FlowCallBackServiceI {
+
+
+    @Autowired
+    private ISysUserService systemUserService;
+    @Autowired
+    private ToolsStocktakingBoundMapper toolsStocktakingBoundMapper;
+    @Autowired
+    private ToolsStocktakingBoundDetailMapper toolsStocktakingBoundDetailMapper;
+    @Resource
+    private FlowCommonService flowCommonService;
+    @Resource
+    private IFlowDefinitionService flowDefinitionService;
+    @Autowired
+    private IFlowTaskService flowTaskService;
+    @Autowired
+    private IFlowMyBusinessService flowMyBusinessService;
+    @Autowired
+    private TaskService taskService;
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void saveMain(ToolsStocktakingBound toolsStocktakingBound, List<ToolsStocktakingBoundDetail> toolsStocktakingBoundDetailList) {
+        toolsStocktakingBoundMapper.insert(toolsStocktakingBound);
+        if (toolsStocktakingBoundDetailList != null && toolsStocktakingBoundDetailList.size() > 0) {
+            for (ToolsStocktakingBoundDetail entity : toolsStocktakingBoundDetailList) {
+                //澶栭敭璁剧疆
+                entity.setGoodsShelvesId(toolsStocktakingBound.getId());
+                toolsStocktakingBoundDetailMapper.insert(entity);
+            }
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void updateMain(ToolsStocktakingBound toolsStocktakingBound, List<ToolsStocktakingBoundDetail> toolsStocktakingBoundDetailList) {
+        toolsStocktakingBoundMapper.updateById(toolsStocktakingBound);
+
+        //1.鍏堝垹闄ゅ瓙琛ㄦ暟鎹�
+        toolsStocktakingBoundDetailMapper.deleteByMainId(toolsStocktakingBound.getId());
+
+        //2.瀛愯〃鏁版嵁閲嶆柊鎻掑叆
+        if (toolsStocktakingBoundDetailList != null && toolsStocktakingBoundDetailList.size() > 0) {
+            for (ToolsStocktakingBoundDetail entity : toolsStocktakingBoundDetailList) {
+                //澶栭敭璁剧疆
+                entity.setGoodsShelvesId(toolsStocktakingBound.getId());
+                toolsStocktakingBoundDetailMapper.insert(entity);
+            }
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void delMain(String id) {
+        toolsStocktakingBoundDetailMapper.deleteByMainId(id);
+        toolsStocktakingBoundMapper.deleteById(id);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void delBatchMain(Collection<? extends Serializable> idList) {
+        for (Serializable id : idList) {
+            toolsStocktakingBoundDetailMapper.deleteByMainId(id.toString());
+            toolsStocktakingBoundMapper.deleteById(id);
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean submintOrder(String id) {
+
+        ToolsStocktakingBound toolsStocktakingBound = this.getById(id);
+        if (toolsStocktakingBound == null) {
+            return false;
+        } else {
+            toolsStocktakingBound.setReviewer(toolsStocktakingBound.getReviewer());
+            //淇敼鐘舵��
+//            toolsStocktakingBound.setApprovalStatus(OutBillStatus.SUBMITTED.getValue());
+            flowCommonService.initActBusiness("鐩樼偣鍗曞彿:" + toolsStocktakingBound.getOrderCode() + ";鐩樼偣鍚嶇О: " + toolsStocktakingBound.getStocktakingName() + ";杩涜鐩樼偣",
+                    toolsStocktakingBound.getId(), "IToolsStocktakingBoundService", "tools_stocktaking_bound", null);
+            Map<String, Object> variables = new HashMap<>();
+            variables.put("dataId", toolsStocktakingBound.getId());
+            if (StrUtil.isEmpty(toolsStocktakingBound.getReviewer())) {
+                variables.put("organization", "鏂板宸ュ叿鐩樼偣鍗曢粯璁ゅ惎鍔ㄦ祦绋�");
+                variables.put("comment", "鏂板宸ュ叿鐩樼偣鍗曢粯璁ゅ惎鍔ㄦ祦绋�");
+            } else {
+                variables.put("organization", toolsStocktakingBound.getRemark());
+                variables.put("comment", toolsStocktakingBound.getRemark());
+            }
+            variables.put("proofreading", true);
+            List<String> usernames = new ArrayList<>();
+            usernames.add(toolsStocktakingBound.getReviewer());
+            variables.put("NextAssignee", usernames);
+            Result result = flowDefinitionService.startProcessInstanceByKey("tools_stocktaking_bound", variables);
+            if (result != null) {
+                toolsStocktakingBound.setInventoryTime(new Date());
+                toolsStocktakingBound.setApprovalStatus(OutBillStatus.SUBMITTED.getValue());
+                //淇濆瓨宸ュ崟
+                toolsStocktakingBoundMapper.updateById(toolsStocktakingBound);
+                return result.isSuccess();
+            }
+            return true;
+        }
+
+
+    }
+
+
+    @Override
+    public void approvalProcess(StocktakingBoundFlowDto stocktakingBoundFlowDto) {
+        if (StrUtil.isBlank(stocktakingBoundFlowDto.getTaskId()) || StrUtil.isBlank(stocktakingBoundFlowDto.getDataId())) {
+            throw new JeecgBootException("闈炴硶鍙傛暟锛�");
+        }
+
+        // 鑾峰彇褰撳墠鐧诲綍鐢ㄦ埛
+        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        if (user == null || StrUtil.isBlank(user.getId())) {
+            throw new JeecgBootException("璐﹀彿涓嶅瓨鍦�");
+        }
+
+        //鑾峰彇鎶ユ崯鍗曚俊鎭�
+        ToolsStocktakingBound toolsStocktakingBound = getById(stocktakingBoundFlowDto.getDataId());
+        if (toolsStocktakingBound == null) {
+            throw new JeecgBootException("鏈壘鍒板搴旂殑鍑哄簱鐢宠鍗曪紒");
+        }
+
+        //鑾峰彇娴佺▼涓氬姟璁板綍
+        FlowMyBusiness flowMyBusiness = getFlowMyBusiness(stocktakingBoundFlowDto.getInstanceId());
+        if (flowMyBusiness == null) {
+            throw new JeecgBootException("娴佺▼璁板綍涓嶅瓨鍦�");
+        }
+
+        // 妫�鏌ョ敤鎴锋槸鍚︽湁鏉冮檺鎿嶄綔浠诲姟
+        if (!isUserAuthorized(flowMyBusiness, user)) {
+            throw new JeecgBootException("鐢ㄦ埛鏃犳潈鎿嶄綔姝や换鍔�");
+        }
+
+        // 璁ら浠诲姟
+        if (!claimTask(flowMyBusiness.getTaskId(), user)) {
+            throw new JeecgBootException("浠诲姟涓嶅瓨鍦ㄣ�佸凡瀹屾垚鎴栧凡琚粬浜鸿棰�");
+        }
+
+        //璁剧疆娴佺▼鍙橀噺
+        setupProcessVariables(stocktakingBoundFlowDto, toolsStocktakingBound, user);
+
+        //瀹屾垚娴佺▼浠诲姟
+        Result result = flowTaskService.complete(stocktakingBoundFlowDto);
+
+        //鏍规嵁浠诲姟瀹屾垚缁撴灉鏇存柊鐢宠鍗曠姸鎬�
+        if (result.isSuccess()) {
+            toolsStocktakingBound.setApprovalStatus(stocktakingBoundFlowDto.getStatus());
+            if (OutBillStatus.APPROVED.getValue().equals(stocktakingBoundFlowDto.getStatus())) {
+                toolsStocktakingBound.setApprovalStatus(OutBoundStatusEnum.NOT_OUTBOUND.getValue());
+            }
+            toolsStocktakingBound.setApprovalDate(new Date());
+            toolsStocktakingBound.setApprovalOpinion(stocktakingBoundFlowDto.getApprovalOpinion());
+            updateById(toolsStocktakingBound);
+        }
+    }
+
+    private void setupProcessVariables(StocktakingBoundFlowDto stocktakingBoundFlowDto, ToolsStocktakingBound toolsStocktakingBound, LoginUser user) {
+        if (OutBillStatus.SUBMITTED.getValue().equals(toolsStocktakingBound.getApprovalStatus()) && user.getUsername().equals(toolsStocktakingBound.getReviewer())) {
+            Map<String, Object> values = new HashMap<>();
+            values.put("dataId", toolsStocktakingBound.getId());
+            values.put("organization", stocktakingBoundFlowDto.getApprovalOpinion());
+            values.put("comment", stocktakingBoundFlowDto.getApprovalOpinion());
+            values.put("status", stocktakingBoundFlowDto.getStatus());
+            values.put("NextAssignee", Collections.singletonList(toolsStocktakingBound.getReviewer()));
+            stocktakingBoundFlowDto.setValues(values);
+        }
+    }
+
+    private FlowMyBusiness getFlowMyBusiness(String instanceId) {
+        List<FlowMyBusiness> businessList = flowMyBusinessService.list(
+                new LambdaQueryWrapper<FlowMyBusiness>().eq(FlowMyBusiness::getProcessInstanceId, instanceId));
+        return businessList.isEmpty() ? null : businessList.get(0);
+    }
+
+    private boolean isUserAuthorized(FlowMyBusiness flowMyBusiness, LoginUser user) {
+        List<String> todoUsers = JSON.parseArray(flowMyBusiness.getTodoUsers(), String.class);
+        return todoUsers != null && todoUsers.contains(user.getUsername());
+    }
+
+    private boolean claimTask(String taskId, LoginUser user) {
+        Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
+        if (task == null) {
+            return false;
+        }
+        if (task.getAssignee() != null && !task.getAssignee().equals(user.getUsername())) {
+            return false;
+        }
+        taskService.claim(taskId, user.getUsername());
+        return true;
+    }
+    @Override
+    public void afterFlowHandle(FlowMyBusiness business) {
+        business.getTaskNameId();//鎺ヤ笅鏉ュ鎵圭殑鑺傜偣
+        business.getValues();
+        business.getActStatus();
+    }
+
+    @Override
+    public Object getBusinessDataById(String dataId) {
+        return this.getById(dataId);
+    }
+
+    @Override
+    public Map<String, Object> flowValuesOfTask(String taskNameId, Map<String, Object> values) {
+        return null;
+    }
+
+    @Override
+    public List<String> flowCandidateUsernamesOfTask(String taskNameId, Map<String, Object> values) {
+        Object object = values.get("NextAssignee");
+        return (List<String>) object;
+    }
+}

--
Gitblit v1.9.3