Prechádzať zdrojové kódy

对接e管家资产调拨单接口

wanwei 8 mesiacov pred
rodič
commit
889ae31caf

+ 357 - 0
src/main/java/fi/fa/webService/DispatchMidController.java

@@ -0,0 +1,357 @@
+package fi.fa.webService;
+
+
+import com.alibaba.druid.util.StringUtils;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import kd.bos.coderule.api.CodeRuleInfo;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.openapi.common.custom.annotation.ApiController;
+import kd.bos.openapi.common.custom.annotation.ApiMapping;
+import kd.bos.openapi.common.custom.annotation.ApiParam;
+import kd.bos.openapi.common.custom.annotation.ApiPostMapping;
+import kd.bos.openapi.common.result.CustomApiResult;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.coderule.CodeRuleServiceHelper;
+import kd.bos.servicehelper.operation.SaveServiceHelper;
+import org.apache.commons.lang3.ObjectUtils;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * 接收e管家资产调拨单接口
+ */
+@ApiController(value = "midDispatch", desc = "自定义API 中间表新增")
+@ApiMapping(value = "saveMidDispatchApi")
+public class DispatchMidController implements Serializable {
+    /**
+     * @description 资产调拨单中间表新增接口,资产调拨单下推接口
+     * @param info
+     * @return CustomApiResult
+     */
+    @ApiPostMapping(value = "/add", desc = "新增资产调拨单中间表")
+    public CustomApiResult<Object>  AddMidDispatch (@ApiParam(value = "e管家资产调拨单") JSONObject info) {
+        StringBuilder resultString = new StringBuilder();
+        JSONArray data = info.getJSONArray("data");
+        //循环传入的数据
+        for (int i = 0; i < data.size(); i++) {
+            try{
+                JSONObject eobject = data.getJSONObject(i);
+                HashMap<String , Long> map = new HashMap<>();
+                //第一步:保存进中间表
+                SaveMidDispatch(eobject);
+                //组织,人员信息转换
+                String errorChange = Control(eobject, map);
+                //第二步:校验传入信息是否可以下推调拨单
+                String errorCode = Check(eobject, map);
+                //第三步:下推生成调拨单
+                if (StringUtils.isEmpty(errorCode) && StringUtils.isEmpty(errorChange)) {
+                    //下推生成资产调拨单
+                    Push(eobject, map);
+                    //生单后反写中间表,防止反复生单
+                    OncePush(eobject.getString("billno"));
+                }
+                // 错误拼接
+                appendErrorMessages(resultString, errorChange, errorCode);
+            } catch (Exception e){
+                resultString.append("保存过程中发生异常:").append(e.getMessage()).append("\n");
+            }
+        }
+        return resultString.length() == 0
+                ? CustomApiResult.success("推送调拨单成功!")
+                : CustomApiResult.fail("404", resultString.toString());
+    }
+
+    /**
+     * @description 保存中间表
+     * @param jsonObject
+     */
+    private void SaveMidDispatch(JSONObject jsonObject) {
+        DynamicObject midDispatch;
+        //查询中间表,如果有则修改,没有则新增
+        QFilter filter = new QFilter("number", QCP.equals, jsonObject.getString("billno"));
+        DynamicObject[] mid = BusinessDataServiceHelper.load("nckd_e_dispatch_mid","id",new QFilter[] {filter});
+        if (mid.length > 0) {
+            midDispatch = BusinessDataServiceHelper.loadSingle(mid[0].getPkValue(), mid[0].getDynamicObjectType().getName());
+        }else {
+            midDispatch = BusinessDataServiceHelper.newDynamicObject("nckd_e_dispatch_mid");
+        }
+
+        midDispatch.set("number", jsonObject.getString("billno"));//来源单据号
+        midDispatch.set("nckd_user_out", jsonObject.getString("sendUser"));//调出类型对应人员
+        midDispatch.set("nckd_user_in", jsonObject.getString("recieveUser"));//调入负责人
+        midDispatch.set("nckd_date_out", jsonObject.getDate("sendDate"));//调出日期
+        midDispatch.set("nckd_org_out", jsonObject.getString("outOrgId"));//调出组织
+        midDispatch.set("nckd_org_in", jsonObject.getString("orgId"));//调入组织
+        midDispatch.set("nckd_reason", jsonObject.getString("reason"));//调拨原因
+        midDispatch.set("nckd_changemode", "调出");//减少方式默认调出
+        midDispatch.set("nckd_dispatch_type", jsonObject.getString("dispatchType"));//调拨类型 枚举 组织间,组织内
+        midDispatch.set("nckd_dept_in", jsonObject.getString("inDeptId"));//调入部门
+        midDispatch.set("nckd_used_user", jsonObject.getString("user"));//调入使用人
+        midDispatch.set("nckd_storeplace", jsonObject.getString("storeplace"));//调入存放地点
+        String cardNumber = "";
+        JSONArray assetArray = jsonObject.getJSONArray("asset");
+        for (int j = 0; j < assetArray.size(); j++) {
+            //判断资产的组织是否相同
+            JSONObject asset = assetArray.getJSONObject(j);
+            String number = asset.getString("number");
+            String orgId = asset.getString("orgId");
+            cardNumber = number+ ":" + orgId + ",";
+        }
+        midDispatch.set("nckd_card_number_tag", cardNumber);
+        SaveServiceHelper.save(new DynamicObject[]{midDispatch});
+    }
+
+    /**
+     * @description e管家推送数据校验
+     * @param jsonObject,map
+     * @return String
+     */
+    private  String Check(JSONObject jsonObject, HashMap<String , Long> map) {
+        String billno = jsonObject.getString("billno");//源单编号
+        String user = jsonObject.getString("user");//使用人
+        List<String> numberList = new ArrayList<>();
+        // 校验该单据是否已经下推生成调拨单
+        if (isAlreadyDispatched(billno)) {
+            return "单据" + billno + "已经生成调拨单,请勿重复推送!";
+        }
+        // 获取资产编号数组
+        JSONArray assetArray = jsonObject.getJSONArray("asset");
+        if (assetArray.isEmpty()) {
+            return "单据" + billno + "未绑定资产信息,生成调拨单失败";
+        }
+        Boolean isSame = true;
+        //校验资产信息的组织是否相同,不相同则不进行处理
+        for (int j = 0; j < assetArray.size(); j++) {
+            //判断资产的组织是否相同
+            JSONObject asset = assetArray.getJSONObject(j);
+            if (!asset.getString("orgId").equals(assetArray.getJSONObject(0).getString("orgId"))) {
+                isSame = false;
+            }
+            numberList.add(asset.getString("number"));
+        }
+        //组织相同则处理
+        if (isSame) {
+            String  e_orgId = assetArray.getJSONObject(0).getString("orgId");
+            //查询e管家实物卡片清单
+            QFilter filter = new QFilter("number", QCP.in,numberList);
+            DynamicObject[] dynamicObjects = BusinessDataServiceHelper.load("nckd_fa_card_real_list","id",new QFilter[] {filter});
+            if (dynamicObjects.length == 0 || dynamicObjects.length != numberList.size()) {
+                return "单据"+billno+"绑定的资产有未同步至星瀚的数据,生成调拨单失败";
+            }else {
+                DynamicObject cardInfo = BusinessDataServiceHelper.loadSingle(dynamicObjects[0].getPkValue(), dynamicObjects[0].getDynamicObjectType().getName());
+                //获取星瀚资产编码,查询关联的e管家实物卡片清单数量
+                String code  = cardInfo.getString("nckd_card_real_code");
+                if (StringUtils.isEmpty(code)) {
+                    //星瀚未生成实物卡片,更新实物卡片清单数据-查询组织对照表
+                    Long orgId = getOrg(e_orgId);
+                    if (ObjectUtils.isNotEmpty(orgId)) {
+                        //更新归属机构,归属部门,使用人
+                        for (int a = 0; a < dynamicObjects.length ; a++) {
+                            DynamicObject ecardInfoList = BusinessDataServiceHelper.loadSingle(dynamicObjects[a].getPkValue(), dynamicObjects[a].getDynamicObjectType().getName());
+                            ecardInfoList.set("nckd_orgfield",orgId);
+                            ecardInfoList.set("nckd_dept",map.get("inDeptId"));
+                            ecardInfoList.set("nckd_use_name",user);
+                            SaveServiceHelper.save(new DynamicObject[]{ecardInfoList});
+                        }
+                    }else {
+                        return "资产信息的组织在组织对照表中未查询到数据,生成调拨单失败";
+                    }
+                }else {
+                    //查询e管家实物卡片清单
+                    QFilter qfilter = new QFilter("nckd_card_real_code", QCP.equals,code);
+                    DynamicObject[] cardObject = BusinessDataServiceHelper.load("nckd_fa_card_real_list","id",new QFilter[] {qfilter});
+                    //e管家推送的清单和星瀚系统保存的清单数量不一致,返回错误信息并且不能生成调拨单
+                    if (cardObject.length > 0 && assetArray.size() != cardObject.length) {
+                        return "单据"+billno+"绑定的资产信息与星瀚实物卡片数量不一致,生成调拨单失败";
+                    }
+                    jsonObject.put("nckd_card_real_code", code);
+                }
+            }
+        }else {
+            //资产信息组织不同
+            return "单据"+billno+"绑定的资产信息组织不相同,生成调拨单失败";
+        }
+        return null;
+    }
+
+    /**
+     * @description 下推生成资产调拨单
+     * @param jsonObject,map
+     */
+    private void Push(JSONObject jsonObject, HashMap<String , Long> map) {
+        String dispatchType = jsonObject.getString("dispatchType");
+        //组织间,生成资产调出单
+        if ("0".equals(dispatchType)) {
+            DynamicObject dispatch = BusinessDataServiceHelper.newDynamicObject("fa_dispatch");
+            //获取配置编码规则生成的编码
+            CodeRuleInfo codeRule = CodeRuleServiceHelper.getCodeRule(dispatch.getDataEntityType().getName(), dispatch, null);
+            String sysCode = CodeRuleServiceHelper.getNumber(codeRule, dispatch);
+            String nckd_card_real_code = jsonObject.getString("nckd_card_real_code");
+            nckd_card_real_code = "A00100101900240800008";
+            //拼接单据编号
+            String firstTenChars = nckd_card_real_code.substring(0, 10);
+            String billno = firstTenChars + sysCode;
+            //单据头
+            dispatch.set("billno", billno);//单据编号
+            dispatch.set("outuser", map.get("sendUser"));//调出申请人
+            dispatch.set("inuser", map.get("recieveUser"));//调入负责人
+            dispatch.set("dispatchdate", jsonObject.getDate("sendDate"));//调出日期
+            dispatch.set("assetunit", map.get("outOrgId"));//调出组织
+            dispatch.set("inassetunit", map.get("orgId"));//调入组织
+            dispatch.set("org", map.get("outOrgId"));//调出核算组织
+            dispatch.set("inorg", map.get("orgId"));//调入核算组织
+            dispatch.set("reason", jsonObject.getString("reason"));//调出原因
+            dispatch.set("dispatchtype", "A");//调拨类型 A="平价调拨",B="非平价调拨"
+            dispatch.set("changemode", 14);//减少方式默认"调出"
+            dispatch.set("currency", 1);//币种
+            dispatch.set("currencyrate", 1);//结算汇率
+            //制单信息
+            dispatch.set("creator", map.get("sendUser"));//创建人
+            dispatch.set("createtime", jsonObject.getDate("sendDate"));//创建时间
+            dispatch.set("modifier", map.get("recieveUser"));//修改人
+            dispatch.set("modifytime", jsonObject.getDate("sendDate"));//修改时间
+            dispatch.set("auditor", map.get("recieveUser"));//审核人
+            dispatch.set("auditdate", jsonObject.getDate("sendDate"));//审核时间
+            dispatch.set("billstatus", "C");//默认审核
+            dispatch.set("appliant", map.get("sendUser"));//调拨申请人
+            //单据体
+            //根据资产编号查询实物卡片
+            QFilter cardFilter = new QFilter("billno", QCP.equals,nckd_card_real_code);
+            DynamicObject[] card = BusinessDataServiceHelper.load("fa_card_real","id",new QFilter[] {cardFilter});
+            for (int c = 0; c < card.length; c++) {
+                DynamicObject cardInfo = BusinessDataServiceHelper.loadSingle(card[c].getPkValue(), card[c].getDynamicObjectType().getName());
+                //创建调出单分录
+                DynamicObjectCollection entryEntity = dispatch.getDynamicObjectCollection("dispatchentry");
+                DynamicObject entry1 = entryEntity.addNew();
+                entry1.set("realcard", cardInfo);//资产编码
+                entry1.set("measurement", cardInfo.getDynamicObject("unit").getLong("id"));//计量单位
+                entry1.set("dispatchqty", cardInfo.getInt("assetamount"));//数量
+                entry1.set("inusedept", map.get("inDeptId"));//调入使用部门
+            }
+            SaveServiceHelper.save(new DynamicObject[]{dispatch});
+        }
+
+        //组织内,生成资产变更单
+
+    }
+
+    /**
+     * @description 查询组织对照表获取组织id
+     * @param eOrgId
+     * @return Long
+     */
+    private Long getOrg(String eOrgId) {
+        QFilter orgFilter = new QFilter("nckd_e_org", QCP.equals,eOrgId);
+        DynamicObject[] orgControl = BusinessDataServiceHelper.load("nckd_base_org_ext","id",new QFilter[] {orgFilter});
+        if (orgControl.length > 0) {
+            DynamicObject orgControlInfo = BusinessDataServiceHelper.loadSingle(orgControl[0].getPkValue(), orgControl[0].getDynamicObjectType().getName());
+            Long orgId = Long.valueOf(orgControlInfo.getString("nckd_org_number"));
+            return orgId;
+        }//组织对照表查询不到,查询组织表
+        else {
+            QFilter filter = new QFilter("id", QCP.equals,Long.valueOf(eOrgId));
+            DynamicObject[] org = BusinessDataServiceHelper.load("bos_org","id",new QFilter[] {filter});
+            if (org.length > 0) {
+                DynamicObject orgInfo = BusinessDataServiceHelper.loadSingle(org[0].getPkValue(), org[0].getDynamicObjectType().getName());
+                return orgInfo.getLong("id");
+            }
+            return null;
+        }
+    }
+
+    /**
+     * @description 查询用户表获取用户
+     * @param eUser
+     * @return Long
+     */
+    private Long getUser(String eUser) {
+        QFilter filter = new QFilter("number", QCP.in, eUser);
+        DynamicObject[] user = BusinessDataServiceHelper.load("bos_user","id",new QFilter[] {filter});
+        if (user.length > 0) {
+            DynamicObject userInfo = BusinessDataServiceHelper.loadSingle(user[0].getPkValue(), user[0].getDynamicObjectType().getName());
+            Long userId = userInfo.getLong("id");
+            return userId;
+        }
+        return null;
+    }
+
+
+    /**
+     * @description e管家数据转换为星瀚数据
+     * @param jsonObject,map
+     * @return String
+     */
+    private String  Control (JSONObject jsonObject, HashMap<String , Long> map) {
+        //查询人员
+        Long sendUser = getUser(jsonObject.getString("sendUser"));//调出申请人
+        Long recieveUser = getUser(jsonObject.getString("recieveUser"));//调入负责人
+        Long user = getUser(jsonObject.getString("user"));//调入使用人
+        if (ObjectUtils.isEmpty(sendUser) || ObjectUtils.isEmpty(recieveUser) || ObjectUtils.isEmpty(user)) {
+            return "人员信息转换失败";
+        }
+        map.put("sendUser", sendUser);
+        map.put("recieveUser", recieveUser);
+        map.put("user", user);
+
+        //查询组织
+        Long outOrgId = getOrg(jsonObject.getString("outOrgId"));//调出组织
+        Long orgId = getOrg(jsonObject.getString("orgId"));//调入组织
+        Long inDeptId = getOrg(jsonObject.getString("inDeptId"));//调入部门
+        if (ObjectUtils.isEmpty(outOrgId) || ObjectUtils.isEmpty(orgId) || ObjectUtils.isEmpty(inDeptId)) {
+            return "组织信息转换失败";
+        }
+        map.put("outOrgId", outOrgId);
+        map.put("orgId", orgId);
+        map.put("inDeptId", inDeptId);
+        return null;
+    }
+
+
+    /**
+     * @description 生单后反写中间表,防止反复生单
+     * @param billno
+     * @return String
+     */
+    private void OncePush(String billno) {
+        QFilter filter = new QFilter("number", QCP.equals, billno);
+        DynamicObject[] mid = BusinessDataServiceHelper.load("nckd_e_dispatch_mid","id",new QFilter[] {filter});
+        DynamicObject midDispatch = BusinessDataServiceHelper.loadSingle(mid[0].getPkValue(), mid[0].getDynamicObjectType().getName());
+        midDispatch.set("nckd_flag", "1");
+        SaveServiceHelper.save(new DynamicObject[]{midDispatch});
+    }
+
+    /**
+     * @description 判断是否已经下推生成调拨单
+     * @param billno
+     * @return boolean
+     */
+    private boolean isAlreadyDispatched(String billno) {
+        QFilter flagFilter = new QFilter("number", QCP.equals, billno);
+        DynamicObject[] mid = BusinessDataServiceHelper.load("nckd_e_dispatch_mid", "id", new QFilter[]{flagFilter});
+        if (mid.length > 0) {
+            DynamicObject midDispatch = BusinessDataServiceHelper.loadSingle(mid[0].getPkValue(), mid[0].getDynamicObjectType().getName());
+            String flag = midDispatch.getString("nckd_flag");
+            return "1".equals(flag);
+        }
+        return false;
+    }
+
+    /**
+     * @description 拼接错误信息
+     * @param resultString,errorChange,errorCode
+     */
+    private void appendErrorMessages(StringBuilder resultString, String errorChange, String errorCode) {
+        if (!StringUtils.isEmpty(errorChange)) {
+            resultString.append(errorChange).append("\n");
+        }
+        if (!StringUtils.isEmpty(errorCode)) {
+            resultString.append(errorCode).append("\n");
+        }
+    }
+}