StockAutoDockDispatchService.java 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286
  1. package service;
  2. import beans.accountbalance.Accountbalance;
  3. import beans.accountbalance.CashbillEntity;
  4. import beans.parameter.Parameter;
  5. import beans.remind.Remind;
  6. import beans.uploaderpdata.UploadDataToERP_HY;
  7. import com.alibaba.fastjson.JSONArray;
  8. import com.alibaba.fastjson.JSONObject;
  9. import common.Controller;
  10. import common.ServiceController;
  11. import common.YosException;
  12. import common.data.Row;
  13. import common.data.Rows;
  14. import common.data.RowsMap;
  15. import common.data.SQLFactory;
  16. import common.parameter.properties;
  17. import org.apache.commons.lang.StringUtils;
  18. import org.apache.log4j.Logger;
  19. import restcontroller.webmanage.executorService.Executor;
  20. import utility.ERPDocking;
  21. import utility.tools.WebRequest;
  22. import java.math.BigDecimal;
  23. import java.text.SimpleDateFormat;
  24. import java.util.*;
  25. public class StockAutoDockDispatchService extends ServiceController {
  26. private static Logger logger = Logger.getLogger(DispatchAutoCloseService.class);
  27. @Override
  28. public void serviceRun() throws YosException {
  29. //
  30. System.out.println("销售出库单自动同步任务");
  31. Properties yosProperties = properties.getYosProperties();
  32. if (yosProperties.getProperty("system.runmode.debug").equalsIgnoreCase("false")) {
  33. ArrayList<String> sqlList = new ArrayList<>();
  34. ERPDocking erpDocking = new ERPDocking();
  35. JSONArray ErpSainvoices = erpDocking.queryErpStockBill(500, 1,"销售出库");
  36. JSONArray flags=new JSONArray();
  37. String siteid = "ccyosg";
  38. if (!ErpSainvoices.isEmpty()) {
  39. for (Object ErpSainvoice : ErpSainvoices) {
  40. JSONObject erpSainvoice = (JSONObject) ErpSainvoice;
  41. // 经销商编号
  42. String fagentnum = erpSainvoice.getString("fagentnum");
  43. long sys_enterpriseid = 0;
  44. if (dbConnect.runSqlQuery("select sys_enterpriseid from sa_agents where siteid='ccyosg' and agentnum='" + fagentnum + "'").isNotEmpty()) {
  45. sys_enterpriseid = dbConnect.runSqlQuery("select sys_enterpriseid from sa_agents where siteid='ccyosg' and agentnum='" + fagentnum + "'").get(0).getLong("sys_enterpriseid");
  46. } else {
  47. JSONObject flag =new JSONObject();
  48. flag.put("syncyosid",erpSainvoice.getStringValue("syncyosid"));
  49. flag.put("fupdateflag", "4");
  50. flag.put("fupdatewarnlog", "yos中不存在【" + fagentnum + "】经销商");
  51. flags.add(flag);
  52. continue;
  53. }
  54. //单号
  55. String fbillnum = erpSainvoice.getString("fbillnum");
  56. // 单据日期
  57. String fdate = erpSainvoice.getString("fdate");
  58. // 会计期间
  59. // String fperiod = content.getString("fperiod");
  60. // 红蓝字
  61. String frb = erpSainvoice.getString("frb");
  62. // 表头仓库
  63. // String fstockno = content.getString("fstockno");
  64. // 单据类型明细
  65. //String ftypemx = content.getString("ftypemx");
  66. // 单据状态
  67. String fstatus = erpSainvoice.getString("fstatus");
  68. // 制单人
  69. String createby = erpSainvoice.getString("createby");
  70. // 制单日期
  71. String createdate = erpSainvoice.getString("createdate");
  72. // // 审核人
  73. // String checkby = erpSainvoice.getString("checkby");
  74. // // 审核日期
  75. // String checkdate = erpSainvoice.getString("checkdate");
  76. // 备注
  77. String fnotes = erpSainvoice.getString("fnote");
  78. String fsourcebillno = erpSainvoice.getString("fsourcebillno");
  79. String fsourcetype = erpSainvoice.getString("fsourcetype");
  80. long sa_dispatchid=0;
  81. if(StringUtils.isNotBlank(fsourcebillno)){
  82. if (dbConnect.runSqlQuery("select sa_dispatchid from sa_dispatch where siteid='ccyosg' and billno='" + fsourcebillno + "'").isNotEmpty()) {
  83. sa_dispatchid = dbConnect.runSqlQuery("select sa_dispatchid from sa_dispatch where siteid='ccyosg' and billno='" + fsourcebillno + "'").get(0).getLong("sa_dispatchid");
  84. } else {
  85. JSONObject flag =new JSONObject();
  86. flag.put("syncyosid",erpSainvoice.getStringValue("syncyosid"));
  87. flag.put("fupdateflag", "4");
  88. flag.put("fupdatewarnlog", "yos中不存在对应的发货单");
  89. flags.add(flag);
  90. continue;
  91. }
  92. }else {
  93. JSONObject flag =new JSONObject();
  94. flag.put("syncyosid",erpSainvoice.getStringValue("syncyosid"));
  95. flag.put("fupdateflag", "4");
  96. flag.put("fupdatewarnlog", "yos中不存在对应的发货单");
  97. flags.add(flag);
  98. continue;
  99. }
  100. Long sa_cashbillid = 0L;
  101. Rows stockbillRows = dbConnect.runSqlQuery("select * from st_stockbill where siteid='ccyosg' and status='审核' and billno='" + fbillnum + "'");
  102. Long st_stockbillid = 0L;
  103. if (stockbillRows.isEmpty() && "审核".equals(fstatus)) {
  104. /**
  105. * DRP不存在销售出库单,且中间表状态为审核且不在删除状态时,DRP中需新增该销售出库单
  106. */
  107. SQLFactory sqlFactory = new SQLFactory(this, "销售出库单新增");
  108. st_stockbillid = createTableID("st_stockbill");
  109. sqlFactory.addParameter("siteid", "ccyosg");
  110. sqlFactory.addParameter("st_stockbillid", st_stockbillid);
  111. sqlFactory.addParameter("sys_enterpriseid", sys_enterpriseid);
  112. sqlFactory.addParameter("billno", fbillnum);
  113. sqlFactory.addParameter("type", "销售出库");
  114. sqlFactory.addParameter("rb", frb.equals("蓝") ? 1 : 0);
  115. sqlFactory.addParameter("billdate", fdate);
  116. sqlFactory.addParameter("createby", createby);
  117. sqlFactory.addParameter("createdate", getDate(createdate));
  118. sqlFactory.addParameter("changeby", createby);
  119. sqlFactory.addParameter("changedate", getDate(createdate));
  120. sqlFactory.addParameter("checkby", createby);
  121. sqlFactory.addParameter("checkdate", getDate(createdate));
  122. sqlFactory.addParameter("remarks", fnotes);
  123. sqlList.add(sqlFactory.getSQL());
  124. JSONArray detailarray = erpSainvoice.getJSONArray("details");
  125. StringBuffer str = new StringBuffer();
  126. for (Object object : detailarray) {
  127. JSONObject jsonObject = (JSONObject) object;
  128. if (str.toString().equals("")) {
  129. str.append("'" + jsonObject.getString("fitemno") + "'");
  130. } else {
  131. str.append(",'" + jsonObject.getString("fitemno") + "'");
  132. }
  133. }
  134. Rows rows;
  135. if (!str.toString().equals("")) {
  136. rows = dbConnect.runSqlQuery("select * from plm_item where siteid='ccyosg' and itemno in " + "(" + str.toString() + ")");
  137. } else {
  138. rows = dbConnect.runSqlQuery("select * from plm_item where siteid='ccyosg' and itemno in('')");
  139. }
  140. RowsMap itemRowsMap = rows.toRowsMap("itemno");
  141. Rows distiptchRows = dbConnect.runSqlQuery("select t2.price,t1.sa_dispatch_itemsid,t1.rowno,t1.sa_orderitemsid,t2.sa_orderid,t3.sys_enterpriseid,t4.sonum,t5.itemno,t5.itemname from sa_dispatch_items t1 inner join sa_orderitems t2 on t1.sa_orderitemsid=t2.sa_orderitemsid and t1.siteid=t2.siteid inner join sa_dispatch t3 on t1.sa_dispatchid=t3.sa_dispatchid and t1.siteid=t3.siteid left join sa_order t4 on t2.sa_orderid=t4.sa_orderid and t2.siteid=t4.siteid left join plm_item t5 on t1.itemid=t5.itemid and t1.siteid=t5.siteid where t3.status in('审核','复核','关闭') and t1.siteid='ccyosg' and t1.sa_dispatchid = " + sa_dispatchid);
  142. RowsMap distiptchRowsMap = distiptchRows.toRowsMap("rowno");
  143. // Rows aftersalesmagRows = dbConnect.runSqlQuery("select t1.price,t1.sa_aftersalesmag_itemsid,t1.sa_orderitemsid,t2.sa_orderid from sa_aftersalesmag_items t1 inner join sa_orderitems t2 on t1.sa_orderitemsid=t2.sa_orderitemsid and t1.siteid=t2.siteid where t1.siteid='ccyosg' and t1.sa_aftersalesmag_itemsid in " + sa_dispatch_itemsids.toString().replace("[", "(").replace("]", ")"));
  144. // RowsMap aftersalesmagRowsMap = aftersalesmagRows.toRowsMap("rowno");
  145. BigDecimal amountTotal = BigDecimal.ZERO;
  146. for (Object object : detailarray) {
  147. JSONObject jsonObject = (JSONObject) object;
  148. String frownum = jsonObject.getString("fentryno");
  149. String fitemno = jsonObject.getString("fitemno");
  150. String fbatchno = jsonObject.getString("fbatchno");
  151. System.err.println(frownum + ":" + fitemno);
  152. BigDecimal fqty = new BigDecimal(jsonObject.getString("fqty"));
  153. fqty = fqty.compareTo(BigDecimal.ZERO) < 0 ? fqty.negate() : fqty;
  154. //String fdetailstockno = jsonObject.getString("fstockno");
  155. //String fbatchno = jsonObject.getString("fbatchno");
  156. String fdetailnotes = jsonObject.getString("fnote");
  157. SQLFactory sqlFactorydetail = new SQLFactory(this, "销售出库单明细新增");
  158. sqlFactorydetail.addParameter("siteid", "ccyosg");
  159. sqlFactorydetail.addParameter("st_stockbill_itemsid", createTableID("st_stockbill_items"));
  160. sqlFactorydetail.addParameter("st_stockbillid", st_stockbillid);
  161. sqlFactorydetail.addParameter("rowno", frownum);
  162. sqlFactorydetail.addParameter("remarks", fnotes);
  163. if (itemRowsMap.containsKey(fitemno) && itemRowsMap.get(fitemno).isNotEmpty()) {
  164. sqlFactorydetail.addParameter("itemid", itemRowsMap.get(fitemno).get(0).getLong("itemid"));
  165. } else {
  166. sqlFactorydetail.addParameter("itemid", 0);
  167. }
  168. sqlFactorydetail.addParameter("remarks", fdetailnotes);
  169. sqlFactorydetail.addParameter("qty", fqty);
  170. if (frb.equals("蓝")) {
  171. if (distiptchRowsMap.containsKey(String.valueOf(frownum)) && distiptchRowsMap.get(frownum).isNotEmpty()) {
  172. sqlFactorydetail.addParameter("sa_dispatch_itemsid", distiptchRowsMap.get(frownum).get(0).getLong("sa_dispatch_itemsid"));
  173. sqlFactorydetail.addParameter("price", distiptchRowsMap.get(frownum).get(0).getBigDecimal("price"));
  174. amountTotal = amountTotal.add(fqty.multiply(distiptchRowsMap.get(frownum).get(0).getBigDecimal("price")));
  175. sqlFactorydetail.addParameter("amount", fqty.multiply(distiptchRowsMap.get(frownum).get(0).getBigDecimal("price")));
  176. sqlFactorydetail.addParameter("sa_orderitemsid", distiptchRowsMap.get(frownum).get(0).getLong("sa_orderitemsid"));
  177. sqlFactorydetail.addParameter("sa_orderid", distiptchRowsMap.get(frownum).get(0).getLong("sa_orderid"));
  178. System.out.println(amountTotal);
  179. //您的订单【XXX】商品【XXX】工厂已发货,出库单号【XXX】
  180. String message = "您的订单【" + distiptchRowsMap.get(frownum).get(0).getString("sonum") + "】商品【" + distiptchRowsMap.get(frownum).get(0).getString("itemname") + "】工厂已发货,出库单号【" + fbillnum + "】!";
  181. sendMsg(message, st_stockbillid, distiptchRowsMap.get(frownum).get(0).getLong("sys_enterpriseid"));
  182. } else {
  183. sqlFactorydetail.addParameter("price", 0);
  184. sqlFactorydetail.addParameter("amount", 0);
  185. sqlFactorydetail.addParameter("sa_orderitemsid", 0);
  186. sqlFactorydetail.addParameter("sa_orderid", 0);
  187. }
  188. }
  189. // else {
  190. // if (aftersalesmagRowsMap.containsKey(String.valueOf(sainvoicedetailid)) && aftersalesmagRowsMap.get(sainvoicedetailid).isNotEmpty()) {
  191. // logger.info(aftersalesmagRowsMap.get(sainvoicedetailid).get(0).toJsonObject().toString());
  192. // sqlFactorydetail.addParameter("price", aftersalesmagRowsMap.get(sainvoicedetailid).get(0).getBigDecimal("price"));
  193. // sqlFactorydetail.addParameter("amount", fqty.multiply(aftersalesmagRowsMap.get(sainvoicedetailid).get(0).getBigDecimal("price")));
  194. // logger.info(aftersalesmagRowsMap.get(sainvoicedetailid).get(0).getBigDecimal("sa_orderitemsid"));
  195. // logger.info(aftersalesmagRowsMap.get(sainvoicedetailid).get(0).getBigDecimal("sa_orderid"));
  196. // sqlFactorydetail.addParameter("sa_orderitemsid", aftersalesmagRowsMap.get(sainvoicedetailid).get(0).getLong("sa_orderitemsid"));
  197. // sqlFactorydetail.addParameter("sa_orderid", aftersalesmagRowsMap.get(sainvoicedetailid).get(0).getLong("sa_orderid"));
  198. // } else {
  199. // sqlFactorydetail.addParameter("price", 0);
  200. // sqlFactorydetail.addParameter("amount", 0);
  201. // sqlFactorydetail.addParameter("sa_orderitemsid", 0);
  202. // sqlFactorydetail.addParameter("sa_orderid", 0);
  203. // }
  204. // }
  205. sqlList.add(sqlFactorydetail.getSQL());
  206. }
  207. sqlList.add("update st_stockbill set status='审核',checkby='" + createby + "',checkdate=CURRENT_TIMESTAMP where st_stockbillid = " + st_stockbillid + " and siteid='ccyosg'"); JSONObject flag =new JSONObject();
  208. flag.put("syncyosid",erpSainvoice.getStringValue("syncyosid"));
  209. flag.put("fupdateflag", "1");
  210. flag.put("fupdatewarnlog", "");
  211. flags.add(flag);
  212. } else if (!stockbillRows.isEmpty() && "审核".equals(fstatus)) {
  213. /**
  214. * DRP存在销售出库单,且中间表状态为审核且不在删除状态时,DRP中需将当前销售出库单先反审核,修改内容后再进行审核
  215. */
  216. sqlList.add("update st_stockbill set status='新建',checkby='',checkdate=null where st_stockbillid = " + stockbillRows.get(0).getLong("st_stockbillid") + " and siteid='ccyosg'");
  217. JSONObject flag =new JSONObject();
  218. flag.put("syncyosid",erpSainvoice.getStringValue("syncyosid"));
  219. flag.put("fupdateflag", "99");
  220. flag.put("fupdatewarnlog", "");
  221. flags.add(flag);
  222. continue;
  223. } else if (!stockbillRows.isEmpty() && "新建".equals(fstatus)) {
  224. /**
  225. * DRP存在收入凭证,且中间表状态为新建或在删除状态时,DRP中需将当前收入销售出库单先反审核
  226. */
  227. sqlList.add("update st_stockbill set status='新建',checkby='',checkdate=null where st_stockbillid = " + stockbillRows.get(0).getLong("st_stockbillid") + " and siteid='ccyosg'");
  228. JSONObject flag =new JSONObject();
  229. flag.put("syncyosid",erpSainvoice.getStringValue("syncyosid"));
  230. flag.put("fupdateflag", "1");
  231. flag.put("fupdatewarnlog", "");
  232. flags.add(flag);
  233. }
  234. }
  235. }
  236. if(erpDocking.updateErpupdateFlag(flags).equals("true")){
  237. dbConnect.runSqlUpdate(sqlList);
  238. /**
  239. * 如单据为新建状态,则,先把单据强行删除掉
  240. */
  241. dbConnect.runSqlUpdate("delete from st_stockbill_items where st_stockbillid in(select st_stockbillid from st_stockbill where status='新建')");
  242. dbConnect.runSqlUpdate("delete from st_stockbill where status='新建'");
  243. }
  244. }
  245. }
  246. public String getDate(String date) {
  247. try {
  248. Date a = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").parse(date);
  249. return new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(a);
  250. } catch (Exception e) {
  251. e.printStackTrace();
  252. }
  253. return null;
  254. }
  255. public void sendMsg(String content, Long st_stockbillid, Long sys_enterpriseid) throws YosException {
  256. ArrayList<Long> userList = getEnterpriseHrs(sys_enterpriseid,"ccyosg").toArrayList("userid", new ArrayList<>());
  257. Remind remind = new Remind(new Controller(new JSONObject()));
  258. remind.setTitle("销售出库单消息");
  259. remind.setContent(content);
  260. remind.setType("应用");
  261. remind.setObjectid(st_stockbillid);
  262. remind.setObjectname("st_stockbill");
  263. remind.setTouserid(userList);
  264. remind.sendByDialogMsg().createSys_message();
  265. }
  266. }