ERPServiceImpl.java 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551
  1. package com.uas.eis.service.Impl;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.alibaba.fastjson.serializer.SerializerFeature;
  5. import com.fasterxml.jackson.databind.ObjectMapper;
  6. import com.uas.eis.core.config.SpObserver;
  7. import com.uas.eis.core.support.TokenProperties;
  8. import com.uas.eis.dao.BaseDao;
  9. import com.uas.eis.dao.SqlRowList;
  10. import com.uas.eis.entity.*;
  11. import com.uas.eis.entity.fanwei.AccountRegisterDetail1;
  12. import com.uas.eis.entity.fanwei.AccountRegisterDetail2;
  13. import com.uas.eis.entity.fanwei.AccountRegisterMain;
  14. import com.uas.eis.entity.fanwei.AccountRegisterReq;
  15. import com.uas.eis.sdk.entity.ApiResult;
  16. import com.uas.eis.sdk.resp.ApiResponse;
  17. import com.uas.eis.service.ERPService;
  18. import com.uas.eis.utils.BaseUtil;
  19. import com.uas.eis.utils.MD5Util;
  20. import com.uas.eis.utils.PSHttpUtils;
  21. import com.uas.eis.utils.StringUtil;
  22. import org.slf4j.Logger;
  23. import org.slf4j.LoggerFactory;
  24. import org.springframework.beans.factory.annotation.Autowired;
  25. import org.springframework.jdbc.core.BeanPropertyRowMapper;
  26. import org.springframework.stereotype.Service;
  27. import org.springframework.transaction.annotation.Transactional;
  28. import java.math.BigDecimal;
  29. import java.time.LocalDate;
  30. import java.time.format.DateTimeFormatter;
  31. import java.util.ArrayList;
  32. import java.util.HashMap;
  33. import java.util.List;
  34. import java.util.Map;
  35. /**
  36. * @author koul
  37. * @email koul@usoftchina.com
  38. * @date 2021-12-06 18:27
  39. */
  40. @Service
  41. public class ERPServiceImpl implements ERPService {
  42. private final Logger logger = LoggerFactory.getLogger(this.getClass());
  43. private static Map<String,String> tokenConfig = TokenProperties.getAllProperty();
  44. @Autowired
  45. private BaseDao baseDao;
  46. @Autowired
  47. private ObjectMapper objectMapper;
  48. // @Override
  49. // public ApiResult<String> syncProductStock(String data) {
  50. // logger.info("sendProd-Begin:master {} ids {}");
  51. // try {
  52. // SqlRowList docMsg = baseDao.queryForRowSet(" select pr_id,to_char(sysdate,'yyyy-mm-dd') ba_date,ba_remain,tspr_eightcode,pr_code,tspr_ninecode,tspr_description,ba_code from product left join batch on pr_code=ba_prodcode left join transsionproduct on pr_code=tspr_uasprcode " +
  53. // " where tspr_enable=-1 and pr_statuscode='AUDITED' and ba_whcode='BSD056' and ba_remain>0");
  54. // if(!docMsg.hasNext()){
  55. // return ApiResponse.failRsp("102","没有需要同步的商品库存");
  56. // }
  57. // List<Map<String, Object>> docMsgResultList = docMsg.getResultList();
  58. // StringBuffer errMsg = new StringBuffer();
  59. // List<Object> docCodes = new ArrayList<>();
  60. // List<SaleMaterialStockVO> list = new ArrayList<>();
  61. // Map<String,Object> reqMap = new HashMap<>();
  62. // String prCodes = "";
  63. // for (Map<String, Object> map : docMsgResultList) {
  64. // docCodes.add(map.get("pr_code"));
  65. // logger.info("sendProd-test: id {} code {}",map.get("pr_id"),map.get("pr_code"));
  66. // // 创建SaleMaterialStockVO对象
  67. // SaleMaterialStockVO saleMaterialStockVO = new SaleMaterialStockVO.Builder()
  68. // .location("BSD056")
  69. // .qdate(StringUtil.nvl(map.get("ba_date")," "))
  70. // .quanity(StringUtil.nvl(map.get("ba_remain")," "))
  71. // .materialNumber(StringUtil.nvl(map.get("tspr_eightcode")," "))
  72. // .supplierMaterialNumber(StringUtil.nvl(map.get("pr_code")," "))
  73. // .mpn(StringUtil.nvl(map.get("tspr_ninecode")," "))
  74. // .status(1)
  75. // .materialDescription(StringUtil.nvl(map.get("tspr_description")," "))
  76. // .batchNo(StringUtil.nvl(map.get("ba_code")," "))
  77. // .build();
  78. // list.add(saleMaterialStockVO);
  79. // }
  80. // reqMap.put("list",list);
  81. // logger.info("sendProd-End:master {} ids {}");
  82. // if(errMsg.length()>0){
  83. // return ApiResponse.failRsp("101",errMsg.toString());
  84. // }
  85. // String json = null;
  86. // try{
  87. // json = objectMapper.writeValueAsString(reqMap);
  88. // logger.info("Request JSON: {}", json);
  89. //
  90. //
  91. // }
  92. // catch (JsonProcessingException e) {
  93. // e.printStackTrace();
  94. // logger.info("sendProd-Error:JSON转换失败 codes {} ",prCodes);
  95. // return ApiResponse.failRsp("106","JSON转换失败");
  96. // } catch (Exception e) {
  97. // e.printStackTrace();
  98. // //eMsg = StringUtil.nvl(e.getMessage(),"无");
  99. // //baseDao.execute("update product set pr_sendwmsstatus='同步失败' ,pr_sendwmserr='操作:同步' where pr_code in ("+prCodes+")");
  100. // throw new RuntimeException(e);
  101. // }
  102. // //接口入参,接口平台会直接将当前账号信息传入接口
  103. // //String json ="{\"elsAccount\":\"864385\"}";
  104. // //接口提供方企业应用账号
  105. // String elsAccount = "864385";
  106. // //接口标识
  107. // String interfaceCode = "SRM009";
  108. // //接口参数组装
  109. // EntryForPOST post = EntryForPOST.builder().elsAccount(elsAccount)
  110. // .businessType(interfaceCode)
  111. // .reuestData(json)
  112. // .specialSign(interfaceCode)
  113. // .build();
  114. //
  115. // JSONObject jsonObject = new JSONObject();
  116. // JSONObject result = null;
  117. // try {
  118. // //接口调用
  119. // result = OpenApiUtil.doPost(post);
  120. // } catch (Exception e) {
  121. // jsonObject.put("message", e.getMessage());
  122. // System.out.println("error1"+e.getMessage());
  123. // }
  124. // //接口返回结果
  125. // jsonObject.put("message", result.toJSONString());
  126. // System.out.println(jsonObject.get("message"));
  127. // return ApiResponse.successRsp("0","同步库存成功");
  128. // } catch (Exception e) {
  129. // JSONObject jsonObject = new JSONObject();
  130. // jsonObject.put("message", e.getMessage());
  131. // System.out.println("error1"+e.getMessage());
  132. // return ApiResponse.failRsp("101",jsonObject.getString("message"));
  133. // }
  134. // }
  135. //
  136. // @Override
  137. // public ApiResult<String> syncOriFactoryDelivery(String data) {
  138. // logger.info("sendOriFactoryDelivery-Begin:master {} ids {}");
  139. // try {
  140. // SqlRowList docMsg = baseDao.queryForRowSet(" select nvl(pd_qty-nvl(pd_acceptqty,0),0) wrkQty,tspr_uasprcode,tspr_eightcode,tspr_ninecode,to_char(pu_date,'yyyy-mm-dd') pu_date,pu_code,pd_detno, " +
  141. // " to_char(pd_delivery,'yyyy-mm-dd') pd_delivery,pd_qty,pd_qty pd_qtyreply,to_char(pd_delivery,'yyyy-mm-dd') pd_deliveryreply,'' pd_remark " +
  142. // " from purchasedetail left join purchase on pd_puid=pu_id left join transsionproduct on pd_prodcode=tspr_uasprcode " +
  143. // " where pu_statuscode = 'AUDITED' and nvl(pd_mrpstatuscode,' ')<>'FINISH' and pd_qty-nvl(pd_acceptqty,0)>0 and upper(pd_custname) in ('传音','上海传音') and nvl(tspr_uasprcode,' ') <> 'STK35F62' " +
  144. // " and nvl(TSPR_EIGHTCODE,' ')<>' ' and nvl(tspr_ENABLE,0) = -1 order by pd_prodcode,pd_puid,pd_detno");
  145. // if(!docMsg.hasNext()){
  146. // return ApiResponse.failRsp("102","没有需要同步的商品库存");
  147. // }
  148. // List<Map<String, Object>> docMsgResultList = docMsg.getResultList();
  149. // StringBuffer errMsg = new StringBuffer();
  150. // List<Object> docCodes = new ArrayList<>();
  151. // List<SupplierSecondMaterialStockVO> list = new ArrayList<>();
  152. // Map<String,Object> reqMap = new HashMap<>();
  153. // String prCodes = "";
  154. // for (Map<String, Object> map : docMsgResultList) {
  155. // docCodes.add(map.get("pr_code"));
  156. // logger.info("sendProd-test: id {} code {}",map.get("pr_id"),map.get("pr_code"));
  157. // // 创建SaleMaterialStockVO对象
  158. // SupplierSecondMaterialStockVO supplierSecondMaterialStockVO = new SupplierSecondMaterialStockVO.Builder()
  159. // .materialOem(StringUtil.nvl(map.get("tspr_uasprcode")," "))
  160. // .matOrderDate(StringUtil.nvl(map.get("pu_date")," "))
  161. // .orderNumber(StringUtil.nvl(map.get("pu_code")," "))
  162. // .orderItemNumber(StringUtil.nvl(map.get("pd_detno")," "))
  163. // .orderReqDate(StringUtil.nvl(map.get("pd_delivery")," "))
  164. // .orderQty(StringUtil.nvl(map.get("pd_qty")," "))
  165. // .orderCondate(StringUtil.nvl(map.get("pd_deliveryreply")," "))
  166. // .orderConQty(StringUtil.nvl(map.get("pd_qtyreply")," "))
  167. // .supplierRemark(StringUtil.nvl(map.get("pd_remark")," "))
  168. // .build();
  169. // list.add(supplierSecondMaterialStockVO);
  170. // }
  171. // reqMap.put("list",list);
  172. // logger.info("sendOriFactoryDelivery-End:master {} ids {}");
  173. // if(errMsg.length()>0){
  174. // return ApiResponse.failRsp("101",errMsg.toString());
  175. // }
  176. // String json = null;
  177. // try{
  178. // json = objectMapper.writeValueAsString(reqMap);
  179. // logger.info("Request JSON: {}", json);
  180. //
  181. //
  182. // }
  183. // catch (JsonProcessingException e) {
  184. // e.printStackTrace();
  185. // logger.info("sendOriFactoryDelivery-Error:JSON转换失败 codes {} ",prCodes);
  186. // return ApiResponse.failRsp("106","JSON转换失败");
  187. // } catch (Exception e) {
  188. // e.printStackTrace();
  189. // //eMsg = StringUtil.nvl(e.getMessage(),"无");
  190. // //baseDao.execute("update product set pr_sendwmsstatus='同步失败' ,pr_sendwmserr='操作:同步' where pr_code in ("+prCodes+")");
  191. // throw new RuntimeException(e);
  192. // }
  193. // //接口入参,接口平台会直接将当前账号信息传入接口
  194. // //String json ="{\"elsAccount\":\"864385\"}";
  195. // //接口提供方企业应用账号
  196. // String elsAccount = "864385";
  197. // //接口标识
  198. // String interfaceCode = "SRM013";
  199. // //接口参数组装
  200. // EntryForPOST post = EntryForPOST.builder().elsAccount(elsAccount)
  201. // .businessType(interfaceCode)
  202. // .reuestData(json)
  203. // .specialSign(interfaceCode)
  204. // .build();
  205. //
  206. // JSONObject jsonObject = new JSONObject();
  207. // JSONObject result = null;
  208. // try {
  209. // //接口调用
  210. // result = OpenApiUtil.doPost(post);
  211. // } catch (Exception e) {
  212. // jsonObject.put("message", e.getMessage());
  213. // System.out.println("error1"+e.getMessage());
  214. // }
  215. // //接口返回结果
  216. // jsonObject.put("message", result.toJSONString());
  217. // System.out.println(jsonObject.get("message"));
  218. // return ApiResponse.successRsp("0","同步库存成功");
  219. // } catch (Exception e) {
  220. // JSONObject jsonObject = new JSONObject();
  221. // jsonObject.put("message", e.getMessage());
  222. // System.out.println("error1"+e.getMessage());
  223. // return ApiResponse.failRsp("101",jsonObject.getString("message"));
  224. // }
  225. // }
  226. @Override
  227. @Transactional
  228. public ApiResult<Map<Object, Object>> saveAccountRegister(AccountRegisterReq accountRegisterReq) {
  229. Map result = new HashMap();
  230. try {
  231. JSONObject jsonObject = new JSONObject();
  232. logger.info("saveAccountRegister-Begin:master {} ids {}");
  233. String caller="AccountRegister!Bank";
  234. AccountRegisterMain accountRegisterMain = accountRegisterReq.getAccountRegisterMain();
  235. String ev = accountRegisterMain.getEv();
  236. String master = "BSD_HK.";
  237. if("QXKW".equals(ev.toUpperCase())){
  238. SpObserver.putSp("QXKW");
  239. master = "QXKW.";
  240. }else if("BSDHK".equals(ev.toUpperCase())){
  241. SpObserver.putSp("BSD_HK");
  242. }
  243. int ar_id = baseDao.getSeqId(master+"ACCOUNTREGISTER_SEQ");
  244. String code = baseDao.callProcedure(master+"Sp_GetMaxNumber", new Object[] { "AccountRegister", 2 });
  245. //String code = baseDao.sGetMaxNumber(master+"AccountRegister", 2);
  246. List<String> sqls = new ArrayList<>();
  247. // 应收票据收款、应付票据付款 必须有来源,不允许手工新增
  248. String type = accountRegisterMain.getType();
  249. //Employee employee = SystemSession.getUser();
  250. if ("应收票据收款".equals(type) || "应付票据付款".equals(type)){
  251. return ApiResponse.failRsp("102",type + " 必须有来源,不允许手工新增");
  252. }
  253. List<AccountRegisterDetail1> accountRegisterDetail1s = accountRegisterReq.getListDetail1();
  254. String err_out = "";
  255. int count = accountRegisterDetail1s.size();
  256. for (AccountRegisterDetail1 map : accountRegisterDetail1s) {
  257. String cate_code = map.getCatecode(); // 科目编码
  258. BigDecimal detno = map.getDetno();
  259. if (!cate_code.trim().equals("")) {
  260. Object o = baseDao.getFieldDataByCondition(master+"CATEGORY", "ca_isleaf", "ca_code='" + cate_code + "'");
  261. String isleaf = o == null ? "0" : o.toString();
  262. if (isleaf.equals("0")) {
  263. // 科目不是子节点 报错
  264. err_out = err_out + String.valueOf(detno);
  265. if (accountRegisterDetail1s.indexOf(map) == count - 1) {
  266. } else {
  267. err_out = err_out + ",";
  268. }
  269. }
  270. }
  271. }
  272. if (!err_out.equals("")) {
  273. return ApiResponse.failRsp("102","第" + err_out + "条明细行科目不是末级科目,不能保存明细行!");
  274. }
  275. Object date = (Object) accountRegisterMain.getDate();
  276. //baseDao.checkCloseMonth("MONTH-B", date);
  277. boolean bool = baseDao.checkIf(master+"PeriodsDetail", "pd_code='MONTH-B' and pd_status=99 and pd_detno=to_char(to_date('" + date
  278. + "','yyyy-mm-dd hh24:mi:ss'), 'yyyymm')");
  279. if (bool) {
  280. return ApiResponse.failRsp("102",type + " 单据日期所属期间已结账,不允许进行当前操作!");
  281. }
  282. if (accountRegisterMain.getDate() == null || "".equals(accountRegisterMain.getDate())){
  283. return ApiResponse.failRsp("102",type + " 参数单据日期为空!");
  284. }
  285. if (accountRegisterMain.getAccountcode() == null || "".equals(accountRegisterMain.getAccountcode())){
  286. return ApiResponse.failRsp("102",type + " 账户编号为空!");
  287. }
  288. // 获取当前日期
  289. LocalDate today = LocalDate.now();
  290. // 格式化
  291. DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
  292. String formattedDate = today.format(formatter);
  293. logger.info(formattedDate);
  294. String ar_date = accountRegisterMain.getDate() == null || "".equals(accountRegisterMain.getDate()) ? formattedDate : accountRegisterMain.getDate();
  295. String ar_type = accountRegisterMain.getType() == null ? "" : accountRegisterMain.getType();
  296. String ar_currencytype = accountRegisterMain.getCurrencytype() == null ? "" : accountRegisterMain.getCurrencytype();
  297. String ar_accountcode = accountRegisterMain.getAccountcode() == null ? "" : accountRegisterMain.getAccountcode();
  298. String ar_accountname = accountRegisterMain.getAccountname() == null ? "" : accountRegisterMain.getAccountname();
  299. String ar_accountcurrency = accountRegisterMain.getAccountcurrency() == null ? "" : accountRegisterMain.getAccountcurrency();
  300. //String ar_accountrate = accountRegisterMain.getAccountrate() == null ? "" : accountRegisterMain.getAccountrate();
  301. //String ar_payment = accountRegisterMain.getType() == null ? "" : accountRegisterMain.getType();
  302. String ar_departmentcode = accountRegisterMain.getDepartmentcode() == null ? "" : accountRegisterMain.getDepartmentcode();
  303. String ar_departmentname = accountRegisterMain.getDepartmentname() == null ? "" : accountRegisterMain.getDepartmentname();
  304. //String ar_cateid = accountRegisterMain.getType() == null ? "" : accountRegisterMain.getType();
  305. String Sql="insert into "+master+"AccountRegister(ar_id,ar_code,ar_date,ar_type,ar_currencytype,ar_accountcode,ar_accountname,ar_accountcurrency,ar_accountrate" +
  306. ",ar_payment,ar_departmentcode,ar_departmentname,ar_cateid,ar_emid,ar_recordman,ar_status,ar_statuscode,ar_poststatus,ar_poststatuscode)" +
  307. "values("+ar_id+",'"+code+"',to_date('"+ar_date+"','yyyy-MM-dd'),'"+ar_type+"','"+ar_currencytype+"','"+ar_accountcode+"'," +
  308. "'"+ar_accountname+"','"+ar_accountcurrency+"',"+accountRegisterMain.getAccountrate()+"," +
  309. accountRegisterMain.getPayment() +",'"+ar_departmentcode+"','"+ar_departmentname+"',"+accountRegisterMain.getCateid() +"," +
  310. "1033922,'管理员','在录入','ENTERING','未过账','UNPOST')";
  311. sqls.add(Sql);
  312. int ard_id = 0;
  313. List<AccountRegisterDetail2> accountRegisterDetail2s = accountRegisterReq.getListDetail2();
  314. for (AccountRegisterDetail1 accountRegisterDetail1: accountRegisterDetail1s) {
  315. ard_id = baseDao.getSeqId(master+"ACCOUNTREGISTERDETAIL_SEQ");
  316. Sql="insert into "+master+"AccountRegisterDetail(ard_id,ard_arid,ard_detno,ard_explanation,ard_catecode,ard_catedesc,ard_currency,ard_rate,ard_doubledebit,ard_debit,ard_doublecredit,ard_credit)" +
  317. "values("+ard_id+","+ar_id+","+accountRegisterDetail1.getDetno()+",'"+accountRegisterDetail1.getExplanation()+"','"+accountRegisterDetail1.getCatecode()+"','"+
  318. accountRegisterDetail1.getCatedesc()+"','"+accountRegisterDetail1.getCurrency()+"',"+accountRegisterDetail1.getRate()+","+accountRegisterDetail1.getDoubledebit()+","+accountRegisterDetail1.getDebit()+","+accountRegisterDetail1.getDoublecredit()+","+accountRegisterDetail1.getCredit() +")";
  319. sqls.add(Sql);
  320. for (AccountRegisterDetail2 accountRegisterDetail2: accountRegisterDetail2s) {
  321. if (accountRegisterDetail2.getDetailFkId().doubleValue() == accountRegisterDetail1.getDetailId().doubleValue()){
  322. Sql="insert into "+master+"ACCOUNTREGISTERDETAILASS(ARS_ID, ARS_ARDID, ARS_DETNO, ARS_ASSTYPE, ARS_ASSCODE, ARS_ASSNAME, ARS_TYPE)" +
  323. "values("+master+"ACCOUNTREGISTERDETAILASS_seq.nextval,"+ard_id+","+accountRegisterDetail2.getDetno()+",'"+accountRegisterDetail2.getAsstype()+"','"+accountRegisterDetail2.getAsscode()+"','"+
  324. accountRegisterDetail2.getAssname()+"','AccountRegister!Bank')";
  325. sqls.add(Sql);
  326. }
  327. }
  328. }
  329. baseDao.execute(sqls);
  330. //String defaultCurr = baseDao.getDBSetting(caller, "fyCurr");
  331. String defaultCurr="RMB";
  332. int count_fyCurr = baseDao.getCount("select count(1) from "+master+"configs where caller='" + caller + "' and code='fyCurr'");
  333. if (count_fyCurr>0) {
  334. Configs config = baseDao.getJdbcTemplate().queryForObject("select * from "+master+"configs where caller=? and code='fyCurr'",
  335. new BeanPropertyRowMapper<Configs>(Configs.class), caller);
  336. if (config != null && config.getData()!=null && "".equals(config.getData())) {
  337. defaultCurr = config.getData();
  338. }
  339. }
  340. if(defaultCurr != null ){
  341. baseDao.execute("update "+master+"accountregisterdetail set ard_currency='"+defaultCurr+"' WHERE ard_arid in (select ar_id from "+master+"accountregister where ar_id=" + ar_id +" and nvl(ar_currencytype,0)<>0 and ar_type='费用') and nvl(ard_currency,' ')=' '");
  342. }
  343. baseDao.execute("update "+master+"accountregisterdetail set ard_rate=(select cm_crrate from "+master+"CurrencysMonth,"+master+"accountregister where ard_arid=ar_id and cm_crname=ard_currency "
  344. + " and CM_YEARMONTH=to_char(ar_date,'yyyymm')) where ard_arid=" + ar_id + " and nvl(ard_currency,' ')<>' '");
  345. baseDao.execute("update "+master+"accountregisterdetail set ard_debit=round(ard_rate*ard_doubledebit,2) where nvl(ard_doubledebit,0)<>0 and nvl(ard_rate,0)<>0 and ard_arid="
  346. + ar_id);
  347. baseDao.execute("update "+master+"accountregisterdetail set ard_credit=round(ard_rate*ard_doublecredit,2) where nvl(ard_doublecredit,0)<>0 and nvl(ard_rate,0)<>0 and ard_arid="
  348. + ar_id);
  349. baseDao.execute("update "+master+"accountregisterdetail set ard_doubledebit=round(ard_debit/ard_rate,2) where nvl(ard_doubledebit,0)=0 and nvl(ard_rate,0)<>0 and ard_arid="
  350. + ar_id);
  351. baseDao.execute("update "+master+"accountregisterdetail set ard_doublecredit=round(ard_credit/ard_rate,2) where nvl(ard_doublecredit,0)=0 and nvl(ard_rate,0)<>0 and ard_arid="
  352. + ar_id);
  353. String insertAssDetSql = "insert into "+master+"accountregisterdetailass(ars_id,ars_ardid,ars_detno,ars_asstype,ars_asscode,ars_assname,ars_type) values (?,?,?,?,?,?,'AccountRegister!Bank')";
  354. SqlRowList rs = baseDao
  355. .queryForRowSet(
  356. "select * from "+master+"accountregister left join "+master+"accountregisterdetail on ard_arid=ar_id where ard_arid=? and nvl(ard_catecode,' ')<>' '",
  357. ar_id);
  358. while (rs.next()) {
  359. Object catecode = rs.getObject("ard_catecode");
  360. int ardid = rs.getInt("ard_id");
  361. SqlRowList ass = baseDao.queryForRowSet("select ca_assname from "+master+"category where ca_code=? and nvl(ca_assname,' ')<>' '",
  362. catecode);
  363. if (ass.next()) {
  364. String assStr = ass.getString("ca_assname");
  365. String[] codes = assStr.split("#");
  366. for (String assname : codes) {
  367. int i = baseDao.getCount("select count(1) from "+master+"accountregisterdetailass where ars_ardid=" + ardid
  368. + " and ARS_ASSTYPE='" + assname + "'");
  369. if (i == 0) {
  370. Object maxno = baseDao.getFieldDataByCondition(master+"accountregisterdetailass", "max(nvl(ars_detno,0))", "ars_ardid="
  371. + ardid);
  372. maxno = maxno == null ? 0 : maxno;
  373. int detno = Integer.parseInt(maxno.toString()) + 1;
  374. int arsid = baseDao.getSeqId(master+"ACCOUNTREGISTERDETAILASS_SEQ");
  375. baseDao.execute(insertAssDetSql, new Object[] { arsid, ardid, detno, assname, null, null });
  376. }
  377. int arsid = baseDao.getFieldValue(master+"accountregisterdetailass", "ars_id", "ars_ardid=" + ardid + " and ARS_ASSTYPE='"
  378. + assname + "'", Integer.class);
  379. if ("部门".equals(assname) && StringUtil.hasText(rs.getObject("ar_departmentcode"))) {
  380. baseDao.execute("update "+master+"accountregisterdetailass set ars_asscode='" + rs.getObject("ar_departmentcode")
  381. + "', ars_assname='" + rs.getObject("ar_departmentname") + "' where ars_id=" + arsid
  382. + " and nvl(ars_asscode,' ')=' '");
  383. }
  384. if ("项目".equals(assname) && StringUtil.hasText(rs.getObject("ar_prjcode"))) {
  385. baseDao.execute("update "+master+"accountregisterdetailass set ars_asscode='" + rs.getObject("ar_prjcode")
  386. + "', ars_assname='" + rs.getObject("ar_prjname") + "' where ars_id=" + arsid
  387. + " and nvl(ars_asscode,' ')=' '");
  388. }
  389. if ("客户往来".equals(assname) && StringUtil.hasText(rs.getObject("ar_custcode"))) {
  390. baseDao.execute("update "+master+"accountregisterdetailass set ars_asscode='" + rs.getObject("ar_custcode")
  391. + "', ars_assname='" + rs.getObject("ar_custname") + "' where ars_id=" + arsid
  392. + " and nvl(ars_asscode,' ')=' '" + " and nvl(ars_asscode,' ')=' '");
  393. }
  394. if ("供应商往来".equals(assname) && StringUtil.hasText(rs.getObject("ar_vendcode"))) {
  395. baseDao.execute("update "+master+"accountregisterdetailass set ars_asscode='" + rs.getObject("ar_vendcode")
  396. + "', ars_assname='" + rs.getObject("ar_vendname") + "' where ars_id=" + arsid
  397. + " and nvl(ars_asscode,' ')=' '" + " and nvl(ars_asscode,' ')=' '");
  398. }
  399. if ("员工".equals(assname) && StringUtil.hasText(rs.getObject("ar_emcode"))) {
  400. baseDao.execute("update "+master+"accountregisterdetailass set ars_asscode='" + rs.getObject("ar_emcode")
  401. + "', ars_assname='" + rs.getObject("ar_emname") + "' where ars_id=" + arsid
  402. + " and nvl(ars_asscode,' ')=' '" + " and nvl(ars_asscode,' ')=' '");
  403. }
  404. }
  405. }
  406. }
  407. updateErrorString(ar_id,master);
  408. result.put("code", code);
  409. result.put("date", ar_date);
  410. }catch (Exception e){
  411. JSONObject jsonObject = new JSONObject();
  412. jsonObject.put("message", e.getMessage());
  413. return ApiResponse.failRsp("101",jsonObject.getString("message"));
  414. }
  415. return ApiResponse.successRsp("0","同步银行登记成功","",result);
  416. }
  417. public void updateErrorString(int id,String master) {
  418. // 多辅助核算项的核算明细按照科目编号中辅助核算名称顺序重排
  419. SqlRowList detailList = baseDao
  420. .queryForRowSet(
  421. "select ard_id,ca_assname from "+master+"accountregisterdetail left join "+master+"category on ard_catecode=ca_code where ard_arid=? and ca_assname is not null and instr(ca_assname,'#')>0",
  422. id);
  423. while (detailList.next()) {
  424. String[] assNames = detailList.getString("ca_assname").split("#");
  425. int index = 1;
  426. for (String assName : assNames) {
  427. baseDao.execute("update "+master+"accountregisterdetailass set ars_detno=? where ars_ardid=? and ars_asstype=? and ars_detno<>?",
  428. index, detailList.getObject("ard_id"), assName, index);
  429. index++;
  430. }
  431. }
  432. // 单据类型为 费用 或者其它收款 或者其它付款
  433. baseDao.updateByCondition(master+"AccountRegister", "ar_errstring = null", "ar_id=" + id);
  434. SqlRowList rs = baseDao
  435. .queryForRowSet(
  436. "SELECT abs((ROUND(AR_DEPOSIT*AR_ACCOUNTRATE,2)+SUM_DEBIT)-(ROUND(AR_PAYMENT*AR_ACCOUNTRATE,2)+SUM_CREDIT)) amount, round((AR_DEPOSIT+AR_PAYMENT)*AR_ACCOUNTRATE,2) bbamount "
  437. + "FROM (SELECT NVL(AR_ACCOUNTRATE,1) AR_ACCOUNTRATE,NVL(AR_PAYMENT,0) AR_PAYMENT,NVL(AR_DEPOSIT,0) AR_DEPOSIT,round(NVL(ARDDEBIT,0),2) SUM_DEBIT,round(NVL(ARDCREDIT,0),2) sum_credit "
  438. + "FROM "+master+"ACCOUNTREGISTER LEFT JOIN (SELECT SUM(NVL(ARD_DEBIT,0)) ARDDEBIT,SUM(NVL(ARD_CREDIT,0)) ARDCREDIT,ARD_ARID FROM "+master+"ACCOUNTREGISTERDETAIL GROUP BY ARD_ARID) on ar_id=ard_arid "
  439. + "where ar_id=? and ar_type in ('费用','其它收款','其它付款'))", id);
  440. if (rs.next()) {
  441. if (rs.getGeneralDouble("amount") >= 0.01) {
  442. baseDao.updateByCondition(master+"AccountRegister",
  443. "ar_errstring = '不平衡(" + rs.getGeneralDouble("amount") + "),本币(" + rs.getGeneralDouble("bbamount") + ")'", "ar_id="
  444. + id);
  445. }
  446. }
  447. }
  448. @Override
  449. public ApiResult<String> syncProduct(String data) {
  450. Map<Object, Object> store = BaseUtil.parseFormStoreToMap(data);
  451. Product product = baseDao.getJdbcTemplate().queryForObject("select case when pr_kh_user='柏英特' or nvl(pr_kh_user,' ')=' ' then 'BYT' else nvl(cu_mescode,cu_code) end pr_kh_user,pr_code ,pr_detail ,replace(PR_SPEC,'''','''''') pr_spec,nvl(pr_unit,'PCS') pr_unit,nvl(pr_cop,'BYT') pr_cop,nvl(pr_version,'0') pr_version,case when nvl(pr_kind,'')='半成品' or nvl(pr_kind,' ')='成品' then 'product' else 'raw' end pr_serial,nvl(pr_validdays,'0') pr_validdays,pr_msdlevel ,pr_fhelpcode ,pr_f_115 ,pr_f_116 ,pr_f_102,pr_kind,flag,pr_statuscode,pr_status from mes_product left join customer on pr_kh_user=cu_shortname where pr_id=?",
  452. new BeanPropertyRowMapper<Product>(Product.class),store.get("pr_id"));
  453. product.setFlag(Integer.parseInt(StringUtil.nvl(store.get("flag"),"-1")));
  454. product.setMesUser(tokenConfig.get("mesUser"));
  455. product.setMesPwd(MD5Util.encodeByMD5(tokenConfig.get("mesPwd")));
  456. return syncMES(JSON.toJSONString(product, SerializerFeature.WriteMapNullValue).replace("null","\"\""),tokenConfig.get("syncProduct"));
  457. }
  458. @Override
  459. public ApiResult<String> syncMakeBase(String data) {
  460. Map<Object, Object> store = BaseUtil.parseFormStoreToMap(data);
  461. Make make = baseDao.getJdbcTemplate().queryForObject("select ma_code,ma_prodcode,ma_qty,nvl(cu_mescode,ma_custcode) ma_custcode,pr_unit,pr_detail,replace(PR_SPEC,'''','''''') pr_spec,ma_salecode,to_char(ma_planbegindate,'yyyy-MM-dd') ma_planbegindate,to_char(ma_planenddate,'yyyy-MM-dd') ma_planenddate,nvl(ma_cop,'BYT') ma_cop,'S' status,to_char(ma_date,'yyyy-MM-dd HH24:mi:ss') ma_date,ma_recorder,nvl(ma_version,0) ma_version,ma_id,wc_id,pr_id,to_char(ma_modifydate,'yyyy-MM-dd HH24:mi:ss') ma_modifydate,ma_modifier from make left join product on ma_prodcode=pr_code left join workcenter on ma_wccode=wc_code left join customer on ma_custcode=cu_code where ma_id=?",
  462. new BeanPropertyRowMapper<Make>(Make.class),store.get("ma_id"));
  463. make.setFlag(Integer.parseInt(StringUtil.nvl(store.get("flag"),"-1")));
  464. make.setMesPwd(MD5Util.encodeByMD5(tokenConfig.get("mesPwd")));
  465. make.setMesUser(tokenConfig.get("mesUser"));
  466. return syncMES(JSON.toJSONString(make, SerializerFeature.WriteMapNullValue).replace("null","\"\""),tokenConfig.get("syncMakeBase"));
  467. }
  468. @Override
  469. public ApiResult<String> syncMakeBaseDetail(String data) {
  470. Map<Object, Object> store = BaseUtil.parseFormStoreToMap(data);
  471. MakeMaterial makeMaterial = baseDao.getJdbcTemplate().queryForObject("select mm_code,erpid,mm_prodcode,pr_detail,replace(PR_SPEC,'''','''''') pr_spec,pr_unit,mm_oneuseqty qty,mm_qty,mm_oneuseqty,case when mm_ifrep=-1 then 'alternative' else 'main' end type,bo_recorder,to_char(bo_date,'yyyy-MM-dd HH24:mi:ss') bo_date,nvl(bo_version,0) bo_version,nvl(bo_cop,'BYT') bo_cop,mm_repprodcode,mm_balance,nvl(cu_mescode,ma_custcode) ma_custcode,to_char(mc_indate,'yyyy-MM-dd HH24:mi:ss') mc_indate,mc_recorder,flag from mes_makematerial left join make on ma_id=mm_maid left join Product on mm_prodcode=pr_code left join bom on bo_id=mm_bomid left join MakeMaterialChangeDet on md_makecode=ma_code and md_mmdetno=mm_detno left join MakeMaterialChange on mc_id=md_mcid left join customer on ma_custcode=cu_code where mm_id=? order by mm_detno",
  472. new BeanPropertyRowMapper<MakeMaterial>(MakeMaterial.class),store.get("mm_id"));
  473. makeMaterial.setFlag(Integer.parseInt(StringUtil.nvl(store.get("flag"),"-1")));
  474. makeMaterial.setMesUser(tokenConfig.get("mesUser"));
  475. makeMaterial.setMesPwd(MD5Util.encodeByMD5(tokenConfig.get("mesPwd")));
  476. return syncMES(JSON.toJSONString(makeMaterial, SerializerFeature.WriteMapNullValue).replace("null","\"\""),tokenConfig.get("syncMakeBaseDetail"));
  477. }
  478. @Override
  479. public ApiResult<String> syncUpdateReceiveByErp(String data) {
  480. try {
  481. Map<Object, Object> store = BaseUtil.parseFormStoreToMap(data);
  482. VerifyApply verifyApply = baseDao.getJdbcTemplate().queryForObject("select va_id,va_mescode,va_code,to_char(va_date,'yyyy-MM-dd HH24:mi:ss') va_date,va_vendcode,va_vendname,va_currency,va_rate,va_paymentscode,va_payments,va_transport,va_sendcode,va_emcode,va_emname,va_departmentcode,va_department,va_recorder,case when nvl(va_cop,' ')=' ' then 'BYT' else va_cop end va_cop,va_remark,va_ancode,va_factory,0 version,va_type,va_pucode,case when nvl(va_pucode,' ')=' ' then 0 else (select pu_id from purchase where pu_code=va_pucode) end pu_id,va_status,1 posted,to_char(va_auditdate,'yyyy-MM-dd HH24:mi:ss') va_auditdate,va_auditman,va_custcode,va_custname from VerifyApply where va_id=?",
  483. new BeanPropertyRowMapper<VerifyApply>(VerifyApply.class), store.get("va_id"));
  484. SqlRowList rs = baseDao.queryForRowSet("select case when va_custcode='AR214' or nvl(va_custcode,' ')=' ' then 'BYT' else nvl(cu_mescode,cu_code) end cu_code,cu_name from verifyapply left join customer on va_custcode=cu_code where va_id="+store.get("va_id"));
  485. if (rs.next()){
  486. verifyApply.setVa_custcode(rs.getString("cu_code"));
  487. //verifyApply.setVa_custname(rs.getString("cu_name"));
  488. }
  489. verifyApply.setMesPwd(MD5Util.encodeByMD5(tokenConfig.get("mesPwd")));
  490. verifyApply.setMesUser(tokenConfig.get("mesUser"));
  491. verifyApply.setFlag(Integer.parseInt(StringUtil.nvl(store.get("flag"),"-1")));
  492. List<VerifyApplyDetail> verifyApplyDetails = baseDao.query("select vad_code,vad_prodcode,pr_detail,replace(PR_SPEC,'''','''''') pr_spec,pr_unit,va_recorder,va_date,pr_kh_user,cu_name,sum(nvl(vad_qty,0)) vad_qty,vad_salecode from ( select vad_code,vad_prodcode,pr_detail,pr_spec,pr_unit,vad_qty,va_recorder,to_char(va_date,'yyyy-MM-dd HH24:mi:ss') va_date,case when pr_kh_user='柏英特' or nvl(pr_kh_user,' ')=' ' then 'BYT' else nvl(cu_mescode,cu_code) end pr_kh_user,cu_name,vad_salecode from verifyapplydetail left join VerifyApply on va_id=vad_vaid left join product on vad_prodcode=pr_code left join customer on cu_shortname=pr_kh_user where nvl(vad_qty,0)>0 and vad_vaid="+store.get("va_id")+") group by vad_code,vad_prodcode,pr_detail,pr_spec,pr_unit,va_recorder,va_date,pr_kh_user,cu_name,vad_salecode", VerifyApplyDetail.class);
  493. verifyApply.setDetail(verifyApplyDetails);
  494. return syncMES(JSON.toJSONString(verifyApply, SerializerFeature.WriteMapNullValue).replace("null","\"\""),tokenConfig.get("syncUpdateReceiveByErp"));
  495. }catch (Exception e){
  496. logger.info("同步收料单异常信息:"+e.getMessage());
  497. e.printStackTrace();
  498. return ApiResponse.failRsp("104",e.getMessage());
  499. }
  500. }
  501. private ApiResult<String> syncMES(String params,String url){
  502. try {
  503. logger.info("params:"+params);
  504. String post = PSHttpUtils.sendPost(tokenConfig.get("mesHttp") + url, params);
  505. logger.info("post:"+post);
  506. JSONObject jsonObject = JSON.parseObject(post);
  507. int code = jsonObject.getIntValue("result");
  508. if (code==0){
  509. return ApiResponse.successRsp("0","同步MES成功");
  510. }else if(code==1){
  511. return ApiResponse.failRsp("101",jsonObject.getString("message"));
  512. }else {
  513. return ApiResponse.failRsp("102","接口调用异常,请联系MES处理!");
  514. }
  515. }catch (Exception e){
  516. logger.info("异常信息:"+e.getMessage());
  517. return ApiResponse.failRsp("103","接口调用异常,请联系MES处理!");
  518. }
  519. }
  520. }