Browse Source

出货通知单上传MES及确认

koul 1 year ago
parent
commit
eccf2630f2

+ 12 - 0
src/main/java/com/uas/eis/controller/ERPController.java

@@ -110,4 +110,16 @@ public class ERPController {
         return erpService.syncMakeScrap(data);
     }
 
+    /**
+     * 同步出货通知单
+     * @param data
+     * @return
+     */
+    @RequestMapping("/erp/syncSendNotify")
+    public Map<String, Object> syncSendNotify(String data){
+        return erpService.syncSendNotify(data);
+    }
+
+
+
 }

+ 10 - 0
src/main/java/com/uas/eis/controller/MESController.java

@@ -197,4 +197,14 @@ public class MESController {
     public ApiResult<String> confirmMakeScrap(HttpServletRequest request){
         return mesService.confirmMakeScrap(request);
     }
+
+    /**
+     * 出货通知单确认
+     * @param
+     * @return
+     */
+    @RequestMapping("/mes/confirmSendNotify")
+    public ApiResult<String> confirmSendNotify(HttpServletRequest request){
+        return mesService.confirmSendNotify(request);
+    }
 }

+ 23 - 23
src/main/java/com/uas/eis/entity/MakeScrapDetail.java

@@ -6,15 +6,15 @@ public class MakeScrapDetail {
     @JSONField(name = "scrapno")
     private String ms_code;
     @JSONField(name = "scrapid")
-    private int ms_id;
+    private String ms_id;
     @JSONField(name = "scrapdetno")
-    private int md_detno;
+    private String md_detno;
     @JSONField(name = "issw")
-    private int issw;
+    private String issw;
     @JSONField(name = "prodno")
     private String md_mmcode;
     @JSONField(name = "proddetno")
-    private int md_mmdetno;
+    private String md_mmdetno;
     @JSONField(name = "itemno")
     private String md_prodcode;
     @JSONField(name = "oriitemno")
@@ -26,40 +26,40 @@ public class MakeScrapDetail {
     @JSONField(name = "mesPwd")
     private String mesPwd;
     @JSONField(name = "actionflag")
-    private int flag;
+    private String flag;
 
-    public int getMs_id() {
+    public String getMs_code() {
+        return ms_code;
+    }
+
+    public void setMs_code(String ms_code) {
+        this.ms_code = ms_code;
+    }
+
+    public String getMs_id() {
         return ms_id;
     }
 
-    public void setMs_id(int ms_id) {
+    public void setMs_id(String ms_id) {
         this.ms_id = ms_id;
     }
 
-    public int getMd_detno() {
+    public String getMd_detno() {
         return md_detno;
     }
 
-    public void setMd_detno(int md_detno) {
+    public void setMd_detno(String md_detno) {
         this.md_detno = md_detno;
     }
 
-    public int getIssw() {
+    public String getIssw() {
         return issw;
     }
 
-    public void setIssw(int issw) {
+    public void setIssw(String issw) {
         this.issw = issw;
     }
 
-    public String getMs_code() {
-        return ms_code;
-    }
-
-    public void setMs_code(String ms_code) {
-        this.ms_code = ms_code;
-    }
-
     public String getMd_mmcode() {
         return md_mmcode;
     }
@@ -68,11 +68,11 @@ public class MakeScrapDetail {
         this.md_mmcode = md_mmcode;
     }
 
-    public int getMd_mmdetno() {
+    public String getMd_mmdetno() {
         return md_mmdetno;
     }
 
-    public void setMd_mmdetno(int md_mmdetno) {
+    public void setMd_mmdetno(String md_mmdetno) {
         this.md_mmdetno = md_mmdetno;
     }
 
@@ -116,11 +116,11 @@ public class MakeScrapDetail {
         this.mesPwd = mesPwd;
     }
 
-    public int getFlag() {
+    public String getFlag() {
         return flag;
     }
 
-    public void setFlag(int flag) {
+    public void setFlag(String flag) {
         this.flag = flag;
     }
 }

+ 128 - 0
src/main/java/com/uas/eis/entity/SendNotify.java

@@ -0,0 +1,128 @@
+package com.uas.eis.entity;
+
+import com.alibaba.fastjson.annotation.JSONField;
+
+import java.io.Serializable;
+import java.util.List;
+
+public class SendNotify implements Serializable {
+    @JSONField(name = "snCode")
+    private String sn_code;
+    @JSONField(name = "custNo")
+    private String sn_custcode;
+    @JSONField(name = "isCheckOutFlag")
+    private int sn_isvmi;
+    @JSONField(name = "userName")
+    private String sn_sellername;
+    @JSONField(name = "remark1")
+    private String sn_remark;
+    @JSONField(name = "remark2")
+    private String sn_remark2;
+    @JSONField(name = "remark3")
+    private String sn_packingremark;
+    @JSONField(name = "companyNo")
+    private String sn_cop;
+    @JSONField(name = "mesUser")
+    private String mesUser;
+    @JSONField(name = "mesPwd")
+    private String mesPwd;
+    @JSONField(name = "flag")
+    private int flag;
+    private List<SendNotifyDetail> detailList;
+
+    public String getSn_code() {
+        return sn_code;
+    }
+
+    public void setSn_code(String sn_code) {
+        this.sn_code = sn_code;
+    }
+
+    public String getSn_custcode() {
+        return sn_custcode;
+    }
+
+    public void setSn_custcode(String sn_custcode) {
+        this.sn_custcode = sn_custcode;
+    }
+
+    public int getSn_isvmi() {
+        return sn_isvmi;
+    }
+
+    public void setSn_isvmi(int sn_isvmi) {
+        this.sn_isvmi = sn_isvmi;
+    }
+
+    public String getSn_sellername() {
+        return sn_sellername;
+    }
+
+    public void setSn_sellername(String sn_sellername) {
+        this.sn_sellername = sn_sellername;
+    }
+
+    public String getSn_remark() {
+        return sn_remark;
+    }
+
+    public void setSn_remark(String sn_remark) {
+        this.sn_remark = sn_remark;
+    }
+
+    public String getSn_remark2() {
+        return sn_remark2;
+    }
+
+    public void setSn_remark2(String sn_remark2) {
+        this.sn_remark2 = sn_remark2;
+    }
+
+    public String getSn_packingremark() {
+        return sn_packingremark;
+    }
+
+    public void setSn_packingremark(String sn_packingremark) {
+        this.sn_packingremark = sn_packingremark;
+    }
+
+    public String getSn_cop() {
+        return sn_cop;
+    }
+
+    public void setSn_cop(String sn_cop) {
+        this.sn_cop = sn_cop;
+    }
+
+    public String getMesUser() {
+        return mesUser;
+    }
+
+    public void setMesUser(String mesUser) {
+        this.mesUser = mesUser;
+    }
+
+    public String getMesPwd() {
+        return mesPwd;
+    }
+
+    public void setMesPwd(String mesPwd) {
+        this.mesPwd = mesPwd;
+    }
+
+    public int getFlag() {
+        return flag;
+    }
+
+    public void setFlag(int flag) {
+        this.flag = flag;
+    }
+
+    public List<SendNotifyDetail> getDetailList() {
+        return detailList;
+    }
+
+    public void setDetailList(List<SendNotifyDetail> detailList) {
+        this.detailList = detailList;
+    }
+}

+ 78 - 0
src/main/java/com/uas/eis/entity/SendNotifyDetail.java

@@ -0,0 +1,78 @@
+package com.uas.eis.entity;
+
+import com.alibaba.fastjson.annotation.JSONField;
+
+import java.io.Serializable;
+
+public class SendNotifyDetail implements Serializable {
+    @JSONField(name = "custOrder")
+    private String snd_ordercode;
+    @JSONField(name = "itemNo")
+    private String snd_prodcode;
+    @JSONField(name = "smQty")
+    private Double snd_outqty;
+    @JSONField(name = "whNo")
+    private String snd_warehousecode;
+    @JSONField(name = "lineSeq")
+    private int snd_orderdetno;
+    @JSONField(name = "idNo")
+    private int snd_id;
+    @JSONField(name = "actionId")
+    private String flag;
+
+    public String getSnd_ordercode() {
+        return snd_ordercode;
+    }
+
+    public void setSnd_ordercode(String snd_ordercode) {
+        this.snd_ordercode = snd_ordercode;
+    }
+
+    public String getSnd_prodcode() {
+        return snd_prodcode;
+    }
+
+    public void setSnd_prodcode(String snd_prodcode) {
+        this.snd_prodcode = snd_prodcode;
+    }
+
+    public Double getSnd_outqty() {
+        return snd_outqty;
+    }
+
+    public void setSnd_outqty(Double snd_outqty) {
+        this.snd_outqty = snd_outqty;
+    }
+
+    public String getSnd_warehousecode() {
+        return snd_warehousecode;
+    }
+
+    public void setSnd_warehousecode(String snd_warehousecode) {
+        this.snd_warehousecode = snd_warehousecode;
+    }
+
+    public int getSnd_orderdetno() {
+        return snd_orderdetno;
+    }
+
+    public void setSnd_orderdetno(int snd_orderdetno) {
+        this.snd_orderdetno = snd_orderdetno;
+    }
+
+    public int getSnd_id() {
+        return snd_id;
+    }
+
+    public void setSnd_id(int snd_id) {
+        this.snd_id = snd_id;
+    }
+
+    public String getFlag() {
+        return flag;
+    }
+
+    public void setFlag(String flag) {
+        this.flag = flag;
+    }
+}

+ 7 - 0
src/main/java/com/uas/eis/service/ERPService.java

@@ -2,6 +2,7 @@ package com.uas.eis.service;
 
 
 import com.uas.eis.sdk.entity.ApiResult;
+import org.springframework.web.bind.annotation.RequestMapping;
 
 import java.util.Map;
 
@@ -40,4 +41,10 @@ public interface ERPService {
      */
     Map<String, Object> syncMakeScrap(String data);
 
+    /**
+     * 同步出货通知单
+     * @param data
+     * @return
+     */
+    Map<String, Object> syncSendNotify(String data);
 }

+ 42 - 3
src/main/java/com/uas/eis/service/Impl/ERPServiceImpl.java

@@ -1,6 +1,7 @@
 package com.uas.eis.service.Impl;
 
 import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.serializer.SerializerFeature;
 import com.uas.eis.core.support.TokenProperties;
@@ -244,6 +245,32 @@ public class ERPServiceImpl implements ERPService {
         return hashMap;
     }
 
+    @Override
+    public Map<String, Object> syncSendNotify(String data) {
+        Map<Object, Object> store = BaseUtil.parseFormStoreToMap(data);
+        Object snId = store.get("sn_id");
+        int flag = Integer.parseInt(StringUtil.nvl(store.get("flag"), "-1"));
+        Map<String, Object> hashMap = new HashMap<>();
+        hashMap.put("code", 0);
+        int count = baseDao.getCount("select count(1) from SendNotify where sn_id="+snId);
+        if (count>0) {
+            SendNotify sendNotify = baseDao.getJdbcTemplate().queryForObject("select sn_code,sn_custcode,nvl(sn_isvmi,0) sn_isvmi,sn_sellername,sn_remark,sn_remark2,sn_packingremark,nvl(sn_cop,'BYT') sn_cop," + flag + " flag from SendNotify where sn_id=?", new BeanPropertyRowMapper<SendNotify>(SendNotify.class), snId);
+            sendNotify.setMesPwd(MD5Util.encodeByMD5(tokenConfig.get("mesPwd")));
+            sendNotify.setMesUser(tokenConfig.get("mesUser"));
+            List<SendNotifyDetail> sendNotifyDetails = baseDao.getJdbcTemplate().query("select snd_ordercode,snd_prodcode,snd_outqty,nvl(A.cd_varchar50_1,snd_warehousecode) snd_warehousecode,snd_orderdetno,snd_id,"+flag+" flag from SendNotifyDetail left join (select cd_varchar50_3,cd_varchar50_1 from customtable left join customtabledetail on ct_id=cd_ctid where ct_caller='MESWarehouse') A on A.cd_varchar50_3=snd_warehousecode where snd_snid="+ snId,new Object[]{},new BeanPropertyRowMapper<SendNotifyDetail>(SendNotifyDetail.class));
+            sendNotify.setDetailList(sendNotifyDetails);
+            Map<String, Object> map = syncMESCheckBomItems(JSON.toJSONString(sendNotify, SerializerFeature.WriteMapNullValue).replace("null", "\"\""), tokenConfig.get("syncSendNotify"));
+            hashMap.put("code", -1);
+            hashMap.put("msg", "MES异常,请联系MES处理!");
+            if (map != null&&!map.isEmpty()) {
+                int code = Integer.parseInt(StringUtil.nvl(map.get("code"), "-1"));
+                hashMap.put("code", code);
+                hashMap.put("msg", map.get("msg"));
+            }
+        }
+        return hashMap;
+    }
+
     private ApiResult<String> syncMES(String params,String url) {
         try {
             logger.info("params:" + params);
@@ -298,14 +325,26 @@ public class ERPServiceImpl implements ERPService {
         try {
             String post = PSHttpUtils.sendPost(tokenConfig.get("mesHttp") + url, params);
             logger.info("post:"+post);
-            JSONObject jsonObject = JSON.parseObject(post);
-            int code = jsonObject.getIntValue("msgId");
+            JSONObject jsonObject;
+            int code=0;
+            String msg="";
+            if (post.contains("MsgId")){
+                JSONArray objects = JSON.parseArray(post);
+                Object obj = objects.get(0);
+                jsonObject=JSON.parseObject(StringUtil.nvl(obj,"{}"));
+                code= jsonObject.getIntValue("MsgId");
+                msg=jsonObject.getString("MsgStr");
+            }else {
+                jsonObject = JSON.parseObject(post);
+                code= jsonObject.getIntValue("msgId");
+                msg=jsonObject.getString("msgStr");
+            }
             if (code==0){
                 map.put("code",code);
                 map.put("msg","同步MES成功");
             }else if(code==1){
                 map.put("code",code);
-                map.put("msg",jsonObject.getString("msgStr"));
+                map.put("msg",msg);
             }else {
                 map.put("msg","接口调用异常,错误代码:"+code+",请联系MES处理!");
             }

+ 170 - 3
src/main/java/com/uas/eis/service/Impl/MESServiceImpl.java

@@ -1231,9 +1231,9 @@ public class MESServiceImpl implements MESService {
                 if (baseDao.checkIf("makematerial","nvl(mm_cp_user,0)=0 and nvl(mm_qty,0)>0 and mm_maid="+data[5])){
                     Object canmadeqty = baseDao.getFieldDataByCondition("make", "(select min(case when NVL(mm_havegetqty,0)-NVL(mm_scrapqty,0)>=mm_qty then ma_qty else floor((nvl(mm_havegetqty, 0)-nvl(mm_scrapqty,0))*1.0/mm_oneuseqty)end) from makematerial where mm_maid=ma_id and nvl(mm_materialstatus,' ')=' ' and mm_oneuseqty>0 and mm_oneuseqty*ma_qty<=mm_qty+0.1 and nvl(mm_cp_user,0)=0)","ma_code='" + makeCode + "'");
                     //备料齐套数量
-                    map.put("canmadeqty",canmadeqty);
+                    map.put("canmadeqty",Double.parseDouble(StringUtil.nvl(canmadeqty,"0")));
                 }else {
-                    map.put("canmadeqty",data[2]);
+                    map.put("canmadeqty",Double.parseDouble(StringUtil.nvl(data[2],"0")));
                 }
                 //工单数量
                 map.put("qty",data[2]);
@@ -1726,6 +1726,9 @@ public class MESServiceImpl implements MESService {
             String msclass = "生产报废单";
             Employee employee = baseDao.getJdbcTemplate().queryForObject("select * from employee where em_code=?", new BeanPropertyRowMapper<Employee>(Employee.class), "mes");
             String msId = StringUtil.nvl(data.get("scrapid"), "");
+            if (baseDao.checkIf("MakeScrap","ms_statuscode='CONFIRMED' and ms_id="+msId)){
+                return ApiResponse.failRsp("10075",requestId,"生产报废单已确认!");
+            }
             baseDao.updateByCondition("MakeScrapdetail", "md_status=99", "md_msid=" + msId);
             List<Object[]> objects = baseDao.getFieldsDatasByCondition("MakeScrapdetail left join make on ma_code=md_mmcode ", new String[]{
                     "ma_id", "md_mmdetno", "md_qty", "md_prodcode"}, " md_msid=" + msId);
@@ -1745,7 +1748,7 @@ public class MESServiceImpl implements MESService {
             int apId = baseDao.getSeqId("APPLICATION_SEQ");
             apCode = baseDao.sGetMaxNumber("Application", 2);
             Object dpcode = baseDao.getFieldDataByCondition("MakeScrapDetail", "min(md_department)", "md_msid=" + msId);
-            baseDao.execute("insert into Application (ap_id,ap_code,ap_kind,ap_date,ap_statuscode,ap_status,ap_pleamanname,ap_pleamanid,ap_recorder,ap_recorderid,ap_recorddate,ap_departcode,ap_departname,ap_source,ap_sourceid,ap_printstatuscode,ap_printstatus,ap_remark,ap_bfcode_user) values " +
+            baseDao.execute("insert into Application (ap_id,ap_code,ap_kind,ap_date,ap_statuscode,ap_status,ap_pleamanname,ap_pleamanid,ap_recorder,ap_recorderid,ap_recorddate,ap_departcode,ap_departname,ap_source,ap_sourceid,ap_printstatuscode,ap_printstatus,ap_remark,ap_bfcode_user) " +
                     " select " + apId + ",'" + apCode + "','超损请购',sysdate,'ENTERING','在录入','" + employee.getEm_name() + "'," + employee.getEm_id() + ",'" + employee.getEm_name() + "'," + employee.getEm_id() + ",sysdate,'" + dpcode + "',dp_name,'" + msclass + "',ms_id,'UNPRINT','未打印','MES生产报废单确认生成',ms_code from MakeScrap,department where dp_code='" + dpcode + "' and ms_id=" + msId);
             baseDao.execute("insert into applicationdetail (ad_id,ad_apid,ad_code,ad_detno,ad_prodcode,ad_qty,ad_use,ad_statuscode,ad_status,ad_source,ad_sourcecode,ad_remark,ad_zzcode_user,ad_zzxh_user,ad_sacode,ad_sadetno) " +
                     "select APPLICATIONDETAIL_SEQ.nextval," + apId + ",'" + apCode + "',md_detno,md_prodcode,md_qty,md_reason,'ENTERING','在录入','" + msclass + "',md_code,'MES生产报废单审核生成',md_mmcode,md_mmdetno,ma_salecode,ma_saledetno from MakeScrapdetail left join make on md_mmcode=ma_code where md_msid=" + msId);
@@ -1756,6 +1759,160 @@ public class MESServiceImpl implements MESService {
         }
     }
 
+    @Override
+    public ApiResult<String> confirmSendNotify(HttpServletRequest request) {
+        String requestId = request.getHeader("RequestId");
+        List<Map<Object, Object>> maps = getJsonsData(request);
+        if (maps!=null&&!maps.isEmpty()){
+            List<Map<String, Object>> hashMaps = new ArrayList<>();
+            List<Key> keys = new ArrayList<>();
+            for (Map<Object, Object> map:maps) {
+                int sndId = Integer.parseInt(StringUtil.nvl(map.get("sndId"), "0"));
+                if (sndId>0){
+                    int snId = Integer.parseInt(StringUtil.nvl(baseDao.getFieldDataByCondition("SendNotifyDetail", "snd_snid", "snd_id=" + sndId), "0"));
+                    if (!baseDao.checkIf("SendNotifyDetail","snd_id="+sndId)){
+                        return ApiResponse.failRsp("10079", requestId, "明细行不存在,请核对!");
+                    }
+                    if (!baseDao.checkIf("SendNotify", "sn_id=" + snId)) {
+                        return ApiResponse.failRsp("10071", requestId, "出货通知单不存在,无法确认!");
+                    }
+                    if (!baseDao.checkIf("SendNotify", "sn_statuscode='AUDITED' and sn_id=" + snId)) {
+                        return ApiResponse.failRsp("10072", requestId, "出货通知单不是已审核状态,无法确认!");
+                    }
+                    if (baseDao.checkIf("SendNotify", "sn_sendstatus='已出库' and sn_id=" + snId)) {
+                        return ApiResponse.failRsp("10073", requestId, "出货通知单已出货,无需重新确认生成!");
+                    }
+                    if (baseDao.checkIf("ProdIODetail", "pd_piclass='出货单' and pd_orderid=" + sndId)) {
+                        return ApiResponse.failRsp("10074", requestId, "出货通知单已转出货单,无需重新确认生成!");
+                    }
+                    // 存在未审批变更单
+                    String dets = baseDao.getJdbcTemplate().queryForObject("select wm_concat(snd_pdno) from sendnotifydetail where snd_id=" + sndId + " and exists (select 1 from SaleChangeDetail left join SaleChange on sc_id=scd_scid where scd_sacode=snd_ordercode and scd_sddetno=snd_orderdetno and sc_statuscode<>'AUDITED' )", String.class);
+                    if (dets != null) {
+                        return ApiResponse.failRsp("10075", requestId, "存在待审批的销售变更单,不能进行转出操作!行号:" + dets);
+                    }
+                    dets = baseDao.getJdbcTemplate().queryForObject("select wm_concat(snd_pdno) from sendnotifydetail where snd_id=" + sndId + " and exists (select 1 from SendNotifyChange left join SendNotifyChangeDetail on sc_id=scd_scid where sc_sncode=snd_code and scd_snddetno=snd_pdno and sc_statuscode<>'AUDITED')", String.class);
+                    if (dets != null) {
+                        return ApiResponse.failRsp("10076", requestId, "存在待审批的通知变更单,不能进行转出操作!行号:" + dets);
+                    }
+                    if (baseDao.isDBSetting("Sale", "zeroOutWhenHung")) {
+                        dets = baseDao.getJdbcTemplate().queryForObject("select distinct wm_concat('通知单号:'||sn_code||'客户:'||sn_custcode) from sendnotify left join SendNotifyDetail on snd_snid=sn_id where nvl(sn_custcode, ' ')<>' ' and snd_id=" + sndId + " and sn_custcode in (select cu_code from customer where cu_status='挂起') and not exists (select 1 from saledetail where sd_code=snd_ordercode and sd_detno=snd_orderdetno and nvl(sd_price,0)=0)", String.class);
+                        if (dets != null) {
+                            return ApiResponse.failRsp("10077", requestId, "通知单客户已挂起,不能进行转出操作!" + dets);
+                        }
+                    } else {
+                        dets = baseDao.getJdbcTemplate().queryForObject("select distinct wm_concat('通知单号:'||sn_code||'客户:'||sn_custcode) from sendnotify left join SendNotifyDetail on snd_snid=sn_id where nvl(sn_custcode, ' ')<>' ' and snd_id=" + sndId + " and sn_custcode in (select cu_code from customer where cu_status='挂起')", String.class);
+                        if (dets != null) {
+                            return ApiResponse.failRsp("10078", requestId, "通知单客户已挂起,不能进行转出操作!" + dets);
+                        }
+                    }
+                    dets = baseDao.getJdbcTemplate().queryForObject("select wm_concat(snd_pdno) from SendNotifyDetail where nvl(snd_statuscode, ' ')<>'AUDITED' and snd_id=" + sndId, String.class);
+                    if (dets != null) {
+                        return ApiResponse.failRsp("10079", requestId, "明细行状态不等于已审核,不能进行转出操作!" + dets);
+                    }
+                    double tqty = Double.parseDouble(StringUtil.nvl(map.get("tqty"), "0"));
+                    String prodCode = StringUtil.nvl(map.get("prodCode"), "");
+                    String whCode = StringUtil.nvl(map.get("whCode"), "");
+                    if ("".equals(prodCode)){
+                        return ApiResponse.failRsp("10063",requestId,"物料不能为空!");
+                    }
+                    if (!baseDao.checkIf("SendNotifyDetail","snd_prodcode='"+prodCode+"' and snd_id="+sndId)){
+                        return ApiResponse.failRsp("10079", requestId, "明细行物料不存在,请核对!");
+                    }
+                    if ("".equals(whCode)){
+                        return ApiResponse.failRsp("10063",requestId,"仓库不能为空!");
+                    }
+                    int count = baseDao.getCount("select count(1) from customtabledetail left join customtable on cd_ctid=ct_id where ct_statuscode='AUDITED' and ct_caller='MESWarehouse' and cd_varchar50_1='" + whCode + "'");
+                    if (count<=0){
+                        return ApiResponse.failRsp("10064",requestId,"MES仓库编号在ERP没有对应关系,请联系管理员新增!");
+                    }
+                    Object[] wh = baseDao.getFieldsDataByCondition("customtabledetail left join customtable on cd_ctid=ct_id left join Warehouse on cd_varchar50_3=wh_code", "cd_varchar50_3,wh_description", "ct_statuscode='AUDITED' and ct_caller='MESWarehouse' and cd_varchar50_1='" + whCode + "'");
+                    if (tqty<=0){
+                        return ApiResponse.failRsp("10063",requestId,"数量需要大于0!");
+                    }
+                    if (baseDao.checkIf("SendNotifyDetail","nvl(snd_yqty,0)+"+tqty+">nvl(snd_outqty,0) and snd_id="+sndId)){
+                        return ApiResponse.failRsp("10063",requestId,"数量+已转出货数不能大于通知单数量!");
+                    }
+                    List<Map<String, Object>> mapList = baseDao.queryForList("select "+tqty+" snd_tqty,'"+wh[0]+"' snd_warehousecode,'"+wh[1]+"' snd_warehouse,sn_code,sn_custcode,snd_prodcode,sn_currency,sn_rate,sn_paymentscode,sn_shcustcode,sn_arcustcode,snd_id,sn_id from SendNotify left join SendNotifyDetail on sn_id=snd_snid left join Product on snd_prodcode=pr_code where snd_id=" + sndId);
+                    hashMaps.addAll(mapList);
+                }
+            }
+            List<Map<Object, Object>> mapList = BaseUtil.parseGridStoreToMaps(StringUtil.nvl(baseDao.changeKeyToLowerCase(hashMaps), "[{}]"));
+            Employee employee = baseDao.getJdbcTemplate().queryForObject("select * from employee where em_code=?", new BeanPropertyRowMapper<Employee>(Employee.class), "mes");
+            Map<Object, List<Map<Object, Object>>> groups = BaseUtil.groupsMap(mapList, new Object[] {"sn_custcode","sn_shcustcode","sn_currency","sn_arcustcode","sn_paymentscode"});
+            // 按客户分组的转入操作
+            Set<Object> mapSet = groups.keySet();
+            List<Map<Object, Object>> items;
+            for (Object s : mapSet) {
+                items = groups.get(s);
+                // 转入通知单主记录
+                Integer sn_id = baseDao.getFieldValue("SendNotifyDetail", "snd_snid", "snd_id=" + items.get(0).get("snd_id"),
+                        Integer.class);
+                Key key = transferRepository.transfer("ProdInOut!Sale", sn_id, employee);
+                if (key != null) {
+                    keys.add(key);
+                    int pi_id = key.getId();
+                    // 转入明细
+                    transferRepository.transfer("ProdInOut!Sale", items, key, employee);
+                    // 地址
+                    baseDao.execute(
+                            "update ProdInOut set pi_address=(select cu_add1 from customer where pi_cardcode=cu_code) where pi_id=? and nvl(pi_address,' ')=' '",
+                            pi_id);
+                    baseDao.execute("update prodinout set (pi_purposename,pi_expresscode,pi_fax)=(select max(ca_person),max(ca_phone),max(ca_fax) from CustomerAddress left join customer on ca_cuid=cu_id where cu_code=pi_cardcode and ca_address=pi_address)  where pi_id="
+                            + pi_id);
+                    baseDao.execute(
+                            "update prodinout set (pi_whcode,pi_whname)=(select pd_whcode,pd_whname from prodiodetail where pd_piid=pi_id and nvl(pd_whcode,' ')<>' ' and rownum<2) where nvl(pi_whcode,' ')=' ' and pi_id=?",
+                            pi_id);
+                    baseDao.execute(
+                            "update ProdIODetail set pd_taxtotal=round(pd_sendprice*(nvl(pd_inqty,0)+nvl(pd_outqty,0)),2), pd_nettotal=round(pd_netprice*(nvl(pd_inqty,0)+nvl(pd_outqty,0)),2) WHERE pd_piid=?",
+                            pi_id);
+                    baseDao.execute("update ProdIODetail set pd_ordertotal=round(pd_outqty*pd_sendprice,2) where pd_piid=?", pi_id);
+                    baseDao.updateByCondition(
+                            "ProdIODetail",
+                            "pd_netprice=round(pd_sendprice/(1+pd_taxrate/100),8),pd_nettotal=round(pd_sendprice*pd_outqty/(1+nvl(pd_taxrate,0)/100),2)",
+                            "pd_piid=" + pi_id);
+                    baseDao.execute(
+                            "update ProdInOut set pi_total=(SELECT round(sum(nvl(pd_sendprice,0)*(nvl(pd_inqty,0)+nvl(pd_outqty,0))),2) FROM ProdIODetail WHERE pd_piid=pi_id) where pi_id=?",
+                            pi_id);
+                    baseDao.updateByCondition("ProdInOut", "pi_totalupper=L2U(nvl(pi_total,0))", "pi_id=" + pi_id);
+                    return ApiResponse.successRsp("0", requestId, "出货单:" + key.getCode() + ",请在ERP查看!");
+                } else
+                    return ApiResponse.failRsp("10080", requestId, "生成失败!");
+            }
+            // 修改出货通知单状态
+            Map<Object, List<Map<Object, Object>>> listMap = BaseUtil.groupsMap(mapList, new Object[]{"sn_id"});
+            // 按客户分组的转入操作
+            Set<Object> mSet = listMap.keySet();
+            for (Object obj : mSet) {
+                String statuscode = null, status = null;
+                int count = baseDao.getCountByCondition("SendNotifyDetail", "snd_snid=" + obj);
+                int yCount = baseDao.getCountByCondition("SendNotifyDetail", "snd_snid=" + obj + " and nvl(snd_yqty,0)=nvl(snd_outqty,0) and nvl(snd_yqty,0)>=0");
+                int xCount = baseDao.getCountByCondition("SendNotifyDetail", "snd_snid=" + obj + " and nvl(snd_yqty,0)=0");
+                statuscode = "PARTOUT";
+                status = "部分出库";
+                if (xCount == count) {
+                    statuscode = "";
+                    status = "";
+                }
+                if (yCount == count) {
+                    statuscode = "TURNOUT";
+                    status = "已出库";
+                }
+                baseDao.updateByCondition("SendNotify", "SN_SENDSTATUSCODE='" + statuscode + "',SN_SENDSTATUS='" + status + "'", "sn_id=" + obj);
+            }
+            if (keys!=null&&!keys.isEmpty()) {
+                String code="";
+                for (Key key:keys) {
+                    //过账出货单
+                    String s = postProdInOut(key.getId(), "ProdInOut!Sale", employee);
+                    code=code+key.getCode()+",";
+                }
+                return ApiResponse.successRsp("0", requestId, "出货单:" + code + ",请在ERP查看!");
+            }else
+                return ApiResponse.failRsp("10082",requestId,"生成失败!");
+        } else
+            return ApiResponse.failRsp("10081",requestId,"参数异常!");
+    }
+
     private Map<String, JSONArray> getData(HttpServletRequest request){
         Map<String, JSONArray> map = new HashMap<>();
         try {
@@ -1787,6 +1944,16 @@ public class MESServiceImpl implements MESService {
         }
         return jsonObject;
     }
+    private List<Map<Object, Object>> getJsonsData(HttpServletRequest request){
+        try {
+            String data = PSHttpUtils.readRaw(request.getInputStream());
+            return BaseUtil.parseGridStoreToMaps(data);
+        } catch (IOException e) {
+            logger.info("参数解析异常信息:"+e.getMessage());
+            e.printStackTrace();
+        }
+        return null;
+    }
 
     private ApiResult<String> checkMESCode(String requestId,String mesNo,String piclass){
         if ("".equals(mesNo)){

+ 1 - 1
src/main/java/com/uas/eis/service/Impl/ScheduleTaskServiceImpl.java

@@ -275,7 +275,7 @@ public class ScheduleTaskServiceImpl implements ScheduleTaskService {
                                     baseDao.updateByCondition("mes_customer","status='D'","status='W' and cu_id="+customer.getCu_id());
                                 }else {
                                     baseDao.updateByCondition("mes_customer","status='F'","status='W' and cu_id="+customer.getCu_id());
-                                    baseDao.execute("insert into meserrorlog (mel_id,mel_url,mel_error,mel_indate,mel_djcode,mel_type) values (MESERRORLOG_SEQ.NEXTVAL,'"+tokenConfig.get("syncCustomer")+"','"+StringUtil.nvl(map.get("msgStr"),"")+"',sysdate,'"+customer.getCu_code()+"','客户资料')");
+                                    baseDao.execute("insert into meserrorlog (mel_id,mel_url,mel_error,mel_indate,mel_djcode,mel_type) values (MESERRORLOG_SEQ.NEXTVAL,'"+tokenConfig.get("syncCustomer")+"','"+StringUtil.nvl(map.get("msg"),"")+"',sysdate,'"+customer.getCu_code()+"','客户资料')");
                                 }
                             }
                         }

+ 6 - 0
src/main/java/com/uas/eis/service/MESService.java

@@ -137,4 +137,10 @@ public interface MESService {
      */
     ApiResult<String> confirmMakeScrap(HttpServletRequest request);
 
+    /**
+     * 生产报废单确认
+     * @param request
+     * @return
+     */
+    ApiResult<String> confirmSendNotify(HttpServletRequest request);
 }

+ 29 - 1
src/main/java/com/uas/eis/utils/BaseUtil.java

@@ -177,5 +177,33 @@ public class BaseUtil {
 	public static String parseGridStore2Str(List<Map<String, Object>> list) {
 		return JacksonUtil.toJsonArray(list);
 	}
-	
+
+	public static Map<Object, List<Map<Object, Object>>> groupsMap(List<Map<Object, Object>> maps, Object[] objects) {
+		Map<Object, List<Map<Object, Object>>> set = new HashMap<Object, List<Map<Object, Object>>>();
+		List<Map<Object, Object>> list = null;
+		String keyValue = null;
+		Object value = null;
+		for (Map<Object, Object> map : maps) {
+			keyValue = null;
+			for (Object field : objects) {
+				if (keyValue != null) {
+					keyValue += "#";
+				} else {
+					keyValue = "";
+				}
+				value = map.get(field);
+				keyValue += value == null ? "" : value;
+			}
+			// Object key = map.get(groupField);
+			if (keyValue != null && !keyValue.equals("") && set.containsKey(keyValue)) {
+				list = set.get(keyValue);
+			} else {
+				list = new ArrayList<Map<Object, Object>>();
+			}
+			list.add(map);
+			set.put(keyValue, list);
+		}
+		return set;
+	}
+
 }

+ 2 - 1
src/main/resources/api_sign_key_mapping.properties

@@ -10,4 +10,5 @@ syncProdInOutMakeGive=updateProdFeedBomByErp
 syncCustomer=webEditCustomer
 syncMakeMaterialCheck=checkProdBomItem
 updateChangeOrderByErp=updateChangeOrderByErp
-syncMakeScrap=updateScrappedItemByErp
+syncMakeScrap=updateScrappedItemByErp
+syncSendNotify=updateErpShipment

+ 0 - 27
src/main/resources/application-dev.yml

@@ -1,27 +0,0 @@
-spring:
-    datasource:
-        type: org.apache.tomcat.jdbc.pool.DataSource
-        driverClassName: oracle.jdbc.OracleDriver
-        username: BOYT
-        password: select!#%*(
-        url: jdbc:oracle:thin:@10.1.81.48:1521:orcl
-server:
-    tomcat:
-        uri_encoding: UTF-8
-    context-path:
-        /EIS
-    port: 8022
-
-Task:
-    SyncProductsMethod: syncProducts
-    SyncProductsCron: 0 0/1 * * * ?
-    SyncMakeBasesMethod: syncMakeBases
-    SyncMakeBasesCron: 0 0/1 * * * ?
-    SyncMakeBaseDetailsMethod: syncMakeBaseDetails
-    SyncMakeBaseDetailsCron: 0 0/1 * * * ?
-    syncMakematerialReplaceMethod: syncMakematerialReplace
-    syncMakematerialReplaceCron: 0 0/1 * * * ?
-
-action:
-    api_action: /EIS/api,/EIS/mes,/EIS/erp
-    public_actions: /EIS/logout,/EIS/hello1