StockAutoDockDispatchService.java 21 KB

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