dispatch.java 49 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772
  1. package restcontroller.webmanage.sale.dispatch;
  2. import beans.data.BatchDeleteErr;
  3. import beans.datacontrllog.DataContrlLog;
  4. import beans.dispatch.Dispatch;
  5. import beans.parameter.Parameter;
  6. import beans.remind.Remind;
  7. import com.alibaba.fastjson.JSONArray;
  8. import com.alibaba.fastjson.JSONObject;
  9. import common.Controller;
  10. import common.YosException;
  11. import common.annotation.API;
  12. import common.annotation.CACHEING;
  13. import common.annotation.CACHEING_CLEAN;
  14. import common.data.Row;
  15. import common.data.Rows;
  16. import common.data.RowsMap;
  17. import common.data.SQLFactory;
  18. import org.apache.commons.lang.StringUtils;
  19. import org.apache.log4j.Logger;
  20. import restcontroller.R;
  21. import restcontroller.sale.cashbill.cashbill;
  22. import restcontroller.webmanage.executorService.Executor;
  23. import restcontroller.webmanage.sale.order.Order;
  24. import restcontroller.webmanage.sale.order.OrderItems;
  25. import utility.ERPDocking;
  26. import java.math.BigDecimal;
  27. import java.util.ArrayList;
  28. import static java.time.LocalDate.now;
  29. /**
  30. * 发货单
  31. */
  32. @API(title = "发货单")
  33. public class dispatch extends Controller {
  34. private static Logger logger = Logger.getLogger(dispatch.class);
  35. public dispatch(JSONObject arg0) throws YosException {
  36. super(arg0);
  37. // TODO Auto-generated constructor stub
  38. }
  39. @API(title = "发货单新增更新", apiversion = R.ID20221114135203.v1.class)
  40. @CACHEING_CLEAN(apiversions = {R.ID20221114135303.v1.class, R.ID20221114135403.v1.class, R.ID20230320160203.v1.class})
  41. public String insertormodify_dispatch() throws YosException {
  42. ArrayList<String> sqlList = new ArrayList<>();
  43. // 表名
  44. String tableName = "sa_dispatch";
  45. Long sa_dispatchid = content.getLong("sa_dispatchid");
  46. Long sa_orderid = content.getLong("sa_orderid");
  47. // Long sys_enterpriseid = content.getLong("sys_enterpriseid");
  48. // Long sa_logiscompid = content.getLong("sa_logiscompid");
  49. // Long rec_contactsid = content.getLongValue("rec_contactsid");
  50. String remarks = content.getStringValue("remarks");
  51. String billdate = content.getStringValue("billdate");
  52. SQLFactory sqlFactory = new SQLFactory(this, "发货单新增");
  53. if (sa_dispatchid <= 0) {
  54. sa_dispatchid = createTableID(tableName);
  55. Rows rowsinfo = dbConnect
  56. .runSqlQuery("select contactsid from sys_enterprise_contacts where workaddress=1 and sys_enterpriseid="
  57. + content.getLong("sys_enterpriseid"));
  58. if (rowsinfo.isEmpty()) {
  59. //return getErrReturnObject().setErrMsg("该订单不存在").toString();
  60. }
  61. sqlFactory.addParameter("sa_orderid", sa_orderid);
  62. // 订货企业id
  63. sqlFactory.addParameter("sys_enterpriseid",content.getLong("sys_enterpriseid"));
  64. // 物流公司档案ID
  65. //sqlFactory.addParameter("sa_logiscompid", rowsinfo.get(0).getLong("sa_logiscompid"));
  66. // 合作企业联系人表ID(收货信息)
  67. if(!rowsinfo.isEmpty()){
  68. sqlFactory.addParameter("rec_contactsid", rowsinfo.get(0).getLong("contactsid"));
  69. }else {
  70. sqlFactory.addParameter("rec_contactsid",0);
  71. }
  72. //运费状态
  73. sqlFactory.addParameter("freightstatus","");
  74. sqlFactory.addParameter("remarks",remarks);
  75. sqlFactory.addParameter("billdate", now());
  76. sqlList.add(DataContrlLog.createLog(this, "sa_dispatch", sa_dispatchid, "新增", "发货单新增成功").getSQL());
  77. } else {
  78. Rows rows = dbConnect.runSqlQuery(
  79. "SELECT status,sys_enterpriseid,rec_contactsid,sa_orderid,freightstatus from sa_dispatch WHERE sa_dispatchid = "
  80. + sa_dispatchid);
  81. if (rows.isNotEmpty()) {
  82. if (rows.get(0).getString("status").equals("新建")) {
  83. sqlFactory = new SQLFactory(this, "发货单更新");
  84. if (sa_orderid <= 0) {
  85. sqlFactory.addParameter("sa_orderid", rows.get(0).getLong("sa_orderid"));
  86. // 订货企业id
  87. if (content.getLong("sys_enterpriseid") <= 0) {
  88. sqlFactory.addParameter("sys_enterpriseid", rows.get(0).getLong("sys_enterpriseid"));
  89. } else {
  90. sqlFactory.addParameter("sys_enterpriseid", content.getLong("sys_enterpriseid"));
  91. }
  92. // 物流公司档案ID
  93. // if (content.getLong("sa_logiscompid") <= 0) {
  94. // sqlFactory.addParameter("sa_logiscompid", rows.get(0).getLong("sa_logiscompid"));
  95. // } else {
  96. // sqlFactory.addParameter("sa_logiscompid", content.getLong("sa_logiscompid"));
  97. // }
  98. // 合作企业联系人表ID(收货信息)
  99. if (content.getLong("rec_contactsid") <= 0) {
  100. sqlFactory.addParameter("rec_contactsid", rows.get(0).getLong("rec_contactsid"));
  101. } else {
  102. sqlFactory.addParameter("rec_contactsid", content.getLong("rec_contactsid"));
  103. }
  104. } else {
  105. Rows rowsinfo = dbConnect.runSqlQuery(
  106. "select rec_contactsid,sys_enterpriseid from sa_order where sa_orderid="
  107. + sa_orderid);
  108. if (rowsinfo.isEmpty()) {
  109. return getErrReturnObject().setErrMsg("该发货单不存在").toString();
  110. }
  111. sqlFactory.addParameter("sa_orderid", sa_orderid);
  112. // 订货企业id
  113. sqlFactory.addParameter("sys_enterpriseid", rowsinfo.get(0).getLong("sys_enterpriseid"));
  114. // 物流公司档案ID
  115. //sqlFactory.addParameter("sa_logiscompid", rowsinfo.get(0).getLong("sa_logiscompid"));
  116. // 合作企业联系人表ID(收货信息)
  117. sqlFactory.addParameter("rec_contactsid", rowsinfo.get(0).getLong("rec_contactsid"));
  118. }
  119. //运费状态
  120. if (!StringUtils.isBlank(content.getStringValue("freightstatus"))) {
  121. sqlFactory.addParameter("freightstatus", content.getStringValue("freightstatus"));
  122. } else {
  123. sqlFactory.addParameter("freightstatus", rows.get(0).getString("freightstatus"));
  124. }
  125. sqlFactory.addParameter("billdate", billdate);
  126. sqlFactory.addParameter("remarks", remarks);
  127. sqlList.add(DataContrlLog.createLog(this, "sa_dispatch", sa_dispatchid, "更新", "发货单更新成功").getSQL());
  128. } else {
  129. return getErrReturnObject().setErrMsg("非新建状态下无法编辑").toString();
  130. }
  131. } else {
  132. return getErrReturnObject().setErrMsg("该发货单不存在").toString();
  133. }
  134. }
  135. sqlFactory.addParameter("siteid", siteid);
  136. sqlFactory.addParameter("userid", userid);
  137. sqlFactory.addParameter("username", username);
  138. sqlFactory.addParameter("sa_dispatchid", sa_dispatchid);
  139. // 发货单号createBillCode("dispatchbillno")
  140. sqlFactory.addParameter("billno", createBillCode("dispatchbill"));
  141. sqlList.add(sqlFactory.getSQL());
  142. dbConnect.runSqlUpdate(sqlList);
  143. content.put("sa_dispatchid", sa_dispatchid);
  144. return queryDispatchMain();
  145. }
  146. @API(title = "发货单详情", apiversion = R.ID20221114135303.v1.class)
  147. @CACHEING
  148. public String queryDispatchMain() throws YosException {
  149. Long sa_dispatchid = content.getLong("sa_dispatchid");
  150. SQLFactory sqlFactory = new SQLFactory(this, "发货单详情查询");
  151. sqlFactory.addParameter("sa_dispatchid", sa_dispatchid);
  152. sqlFactory.addParameter("siteid", siteid);
  153. Rows rows = dbConnect.runSqlQuery(sqlFactory);
  154. Rows sum = dbConnect.runSqlQuery("select sum(t1.qty * t2.price) sumamount,sum(t1.qty) qty from sa_dispatch_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_dispatchid=" + sa_dispatchid);
  155. Row row = rows.isNotEmpty() ? rows.get(0) : new Row();
  156. if (sum.isNotEmpty()) {
  157. row.put("sumamount", sum.get(0).getBigDecimal("sumamount"));
  158. row.put("qty", sum.get(0).getBigDecimal("qty"));
  159. }
  160. //物流
  161. // SQLFactory sqlFactory1 = new SQLFactory(this, "发货单-查询物流信息");
  162. // sqlFactory1.addParameter("siteid", siteid);
  163. // sqlFactory1.addParameter("sa_dispatchid", sa_dispatchid);
  164. // Rows logiscompRows = dbConnect.runSqlQuery(sqlFactory1);
  165. // row.put("logiscomp", logiscompRows.isNotEmpty() ? logiscompRows.get(0) : new Row());
  166. //收货
  167. SQLFactory sqlFactory2 = new SQLFactory(this, "发货单-查询收货信息");
  168. sqlFactory2.addParameter("siteid", siteid);
  169. sqlFactory2.addParameter("sa_dispatchid", sa_dispatchid);
  170. Rows recviceRows = dbConnect.runSqlQuery(sqlFactory2);
  171. row.put("recvice", recviceRows.isNotEmpty() ? recviceRows.get(0) : new Row());
  172. return getSucReturnObject().setData(row).toString();
  173. }
  174. @API(title = "查询发货单列表", apiversion = R.ID20221114135403.v1.class)
  175. @CACHEING
  176. public String queryDispatchList() throws YosException {
  177. StringBuffer where = new StringBuffer(" 1=1 ");
  178. if (content.containsKey("where")) {
  179. JSONObject whereObject = content.getJSONObject("where");
  180. if (whereObject.containsKey("condition") && !"".equals(whereObject.getString("condition"))) {
  181. where.append(" and(");
  182. where.append("t1.billno like'%").append(whereObject.getString("condition")).append("%' ");
  183. where.append("or t3.sonum like'%").append(whereObject.getString("condition")).append("%' ");
  184. where.append("or t2.enterprisename like'%").append(whereObject.getString("condition")).append("%' ");
  185. where.append("or t7.agentnum like'%").append(whereObject.getString("condition")).append("%' ");
  186. where.append("or t1.remarks like'%").append(whereObject.getString("condition")).append("%' ");
  187. where.append(")");
  188. }
  189. if (whereObject.containsKey("status") && !"".equals(whereObject.getString("status"))) {
  190. where.append(" and t1.status ='").append(whereObject.getString("status")).append("' ");
  191. }
  192. if (whereObject.containsKey("begindate") && !"".equals(whereObject.getString("begindate"))) {
  193. where.append(" and t1.billdate >='").append(whereObject.getString("begindate")).append("' ");
  194. }
  195. if (whereObject.containsKey("enddate") && !"".equals(whereObject.getString("enddate"))) {
  196. where.append(" and t1.billdate <='").append(whereObject.getString("enddate")).append("' ");
  197. }
  198. if (whereObject.containsKey("param") && !"".equals(whereObject.getString("param"))) {
  199. Rows rowsDispatchid = dbConnect.runSqlQuery("select t1.sa_dispatchid from sa_dispatch_items t1 left join sa_orderitems t2 on t1.sa_orderitemsid=t2.sa_orderitemsid and t1.siteid=t2.siteid " +
  200. "left join sa_order t3 on t2.sa_orderid=t3.sa_orderid and t2.siteid=t3.siteid left join plm_item t4 on t1.itemid=t4.itemid and t1.siteid=t4.siteid where t1.siteid='"+siteid+"' and (t4.itemname like '%"+whereObject.getString("param")+"%' or t4.itemno like '%"+whereObject.getString("param")+"%' or t3.sonum='"+whereObject.getString("param")+"')");
  201. if(rowsDispatchid.toJsonArray("sa_dispatchid").isEmpty()){
  202. where.append(" and t1.sa_dispatchid in (0)");
  203. }else {
  204. String str = rowsDispatchid.toJsonArray("sa_dispatchid").toJSONString();
  205. str = str.replace("[", "(").replace("]", ")");
  206. where.append(" and t1.sa_dispatchid in" ).append(str);
  207. }
  208. }
  209. }
  210. SQLFactory sqlFactory = new SQLFactory(this, "发货单列表查询", pageSize, pageNumber, pageSorting);
  211. sqlFactory.addParameter("siteid", siteid);
  212. sqlFactory.addParameter_SQL("where", where);
  213. Rows rows = dbConnect.runSqlQuery(sqlFactory);
  214. ArrayList<Long> ids = rows.toArrayList("sa_dispatchid", new ArrayList<>());
  215. //查询数量金额
  216. RowsMap dispatchAmountRowsMap = Dispatch.getDispatchAmountAndQty(this, ids);
  217. for (Row row : rows) {
  218. Long id = row.getLong("sa_dispatchid");
  219. if (dispatchAmountRowsMap.get(id.toString()).isNotEmpty()) {
  220. row.put("sumamount", dispatchAmountRowsMap.get(id.toString()).get(0).getBigDecimal("sumamount"));
  221. row.put("sumqty", dispatchAmountRowsMap.get(id.toString()).get(0).getBigDecimal("sumqty"));
  222. } else {
  223. row.put("sumamount", 0);
  224. row.put("sumqty", 0);
  225. }
  226. }
  227. return getSucReturnObject().setData(rows).toString();
  228. }
  229. @API(title = "经销商列表查询(管理端)", apiversion = R.ID20230324125803.v1.class)
  230. public String query_agentList() throws YosException {
  231. /*
  232. * 过滤条件设置
  233. */
  234. StringBuffer where = new StringBuffer(" 1=1 ");
  235. if (content.containsKey("where")) {
  236. JSONObject whereObject = content.getJSONObject("where");
  237. if (whereObject.containsKey("condition") && !"".equals(whereObject.getString("condition"))) {
  238. where.append(" and(");
  239. where.append("t4.agentnum like'%").append(whereObject.getString("condition")).append("%' ");
  240. where.append("or t3.enterprisename like'%").append(whereObject.getString("condition")).append("%' ");
  241. where.append(")");
  242. }
  243. }
  244. SQLFactory sqlFactory = new SQLFactory(this, "经销商合作企业查询", pageSize, pageNumber, pageSorting);
  245. sqlFactory.addParameter_SQL("where", where);
  246. sqlFactory.addParameter("siteid", siteid);
  247. Rows rows = dbConnect.runSqlQuery(sqlFactory.getSQL(false));
  248. return getSucReturnObject().setData(rows).toString();
  249. }
  250. @API(title = "删除", apiversion = R.ID20221114135503.v1.class)
  251. @CACHEING_CLEAN(apiversions = {R.ID20221114135303.v1.class, R.ID20221114135403.v1.class, R.ID20230320160203.v1.class})
  252. public String delete() throws YosException {
  253. JSONArray sa_dispatchids = content.getJSONArray("sa_dispatchids");
  254. BatchDeleteErr batchDeleteErr = BatchDeleteErr.create(this, sa_dispatchids.size());
  255. for (Object o : sa_dispatchids) {
  256. long sa_dispatchid = Long.parseLong(o.toString());
  257. Rows RowsStatus = dbConnect.runSqlQuery("select sa_dispatchid,status from sa_dispatch where siteid='"
  258. + siteid + "' and sa_dispatchid='" + sa_dispatchid + "'");
  259. Rows logisticsRows = dbConnect.runSqlQuery("select * from sa_logistics_items where siteid='"
  260. + siteid + "' and sa_dispatchid='" + sa_dispatchid + "'");
  261. if (RowsStatus.isNotEmpty()) {
  262. if (!RowsStatus.get(0).getString("status").equals("新建")) {
  263. batchDeleteErr.addErr(sa_dispatchid, "非新建状态的发货单无法删除");
  264. continue;
  265. }
  266. }
  267. if(logisticsRows.isNotEmpty()) {
  268. batchDeleteErr.addErr(sa_dispatchid, "存在发货物流明细信息,无法删除");
  269. continue;
  270. }
  271. dbConnect.runSqlUpdate(
  272. "delete from sa_dispatch where siteid='" + siteid + "' and sa_dispatchid=" + sa_dispatchid);
  273. }
  274. return batchDeleteErr.getReturnObject().toString();
  275. }
  276. // @API(title = "审核", apiversion = R.ID20221114135603.v1.class)
  277. // @CACHEING_CLEAN(apiClass = {Order.class, OrderItems.class, restcontroller.sale.order.Order.class, dispatch.class, dispatchItems.class,cashbill.class})
  278. // public String check() throws YosException {
  279. // Long sa_dispatchid = content.getLong("sa_dispatchid");
  280. // Long sa_orderid = 0L;
  281. // Rows rows = dbConnect.runSqlQuery("select sa_dispatchid,status,billno,sa_orderid from sa_dispatch where sa_dispatchid ='"
  282. // + sa_dispatchid + "' and siteid='" + siteid + "'");
  283. // if (rows.isEmpty()) {
  284. // return getErrReturnObject().setErrMsg("该发货单不存在")
  285. // .toString();
  286. // } else {
  287. // sa_orderid = rows.get(0).getLong("sa_orderid");
  288. // if (!rows.get(0).getString("status").equals("新建")) {
  289. // return getErrReturnObject().setErrMsg("单号为:【" + rows.get(0).getString("billno") + "】的发货单为非新建状态,无法审核")
  290. // .toString();
  291. // }
  292. // }
  293. //
  294. // ArrayList<String> sqlList = new ArrayList<>();
  295. // Rows rowsOrderDetail = dbConnect.runSqlQuery("select t1.undeliqty,t1.deliedqty,t1.qty,t1.sa_orderitemsid from sa_orderitems t1 where t1.sa_orderitemsid in (select sa_orderitemsid from sa_dispatch_items where sa_dispatchid="+ sa_dispatchid+")" );
  296. // RowsMap rowsMap = rowsOrderDetail.toRowsMap("sa_orderitemsid");
  297. // Rows rowsDispatchDetail = dbConnect.runSqlQuery("select t1.qty,t1.sa_orderitemsid,t1.rowno,t2.itemname from sa_dispatch_items t1 left join plm_item t2 on t1.itemid=t2.itemid and t1.siteid=t2.siteid where t1.sa_dispatchid=" + sa_dispatchid);
  298. // if (!rowsDispatchDetail.isEmpty()) {
  299. // for (Row row : rowsDispatchDetail) {
  300. // if (rowsMap.get(row.getString("sa_orderitemsid")).isEmpty()) {
  301. // return getErrReturnObject().setErrMsg("行号为:【" + row.getString("rowno") + "】的发货单明细不存在对应得订单行,无法审核")
  302. // .toString();
  303. // }
  304. // if (row.getBigDecimal("qty").compareTo(rowsMap.get(row.getString("sa_orderitemsid")).get(0).getBigDecimal("undeliqty")) == 1) {
  305. // return getErrReturnObject().setErrMsg("行号为:【" + row.getString("rowno") + "】的发货单明细的数量大于对应订单行的未发货数量,无法审核")
  306. // .toString();
  307. // }
  308. // sqlList.add("update sa_orderitems set undeliqty=" + rowsMap.get(row.getLong("sa_orderitemsid")).get(0).getBigDecimal("undeliqty").subtract(row.getBigDecimal("qty")) + ",deliedqty=" + (row.getBigDecimal("qty").add(rowsMap.get(row.getLong("sa_orderitemsid")).get(0).getBigDecimal("deliedqty"))) + " where sa_orderitemsid=" + row.getLong("sa_orderitemsid"));
  309. // }
  310. // }
  311. // SQLFactory sqlFactoryupdate = new SQLFactory(this, "发货单审核");
  312. // sqlFactoryupdate.addParameter("siteid", siteid);
  313. // sqlFactoryupdate.addParameter("sa_dispatchid", sa_dispatchid);
  314. // sqlFactoryupdate.addParameter("checkby", username);
  315. // sqlList.add(sqlFactoryupdate.getSQL());
  316. // sqlList.add(DataContrlLog.createLog(this, "sa_dispatch", sa_dispatchid, "审核", "发货单审核成功").getSQL());
  317. // dbConnect.runSqlUpdate(sqlList);
  318. //
  319. //
  320. // Executor.sendEml(this, "dispatchrecheck", sa_dispatchid,new ArrayList<>());
  321. // return getSucReturnObject().toString();
  322. //
  323. // }
  324. //
  325. //
  326. @API(title = "反审核", apiversion = R.ID20221114135703.v1.class)
  327. @CACHEING_CLEAN(apiClass = {Order.class, OrderItems.class, restcontroller.sale.order.Order.class, dispatch.class, dispatchItems.class, cashbill.class})
  328. public String uncheck() throws YosException {
  329. Long sa_dispatchid = content.getLong("sa_dispatchid");
  330. Long sa_orderid = 0L;
  331. Rows rows = dbConnect.runSqlQuery("select sa_dispatchid,status,billno,sa_orderid from sa_dispatch where sa_dispatchid ='"
  332. + sa_dispatchid + "' and siteid='" + siteid + "'");
  333. if (rows.isEmpty()) {
  334. return getErrReturnObject().setErrMsg("该发货单不存在")
  335. .toString();
  336. } else {
  337. sa_orderid = rows.get(0).getLong("sa_orderid");
  338. if (!rows.get(0).getString("status").equals("审核")) {
  339. return getErrReturnObject().setErrMsg("单号为:【" + rows.get(0).getString("billno") + "】的发货单为非审核状态,无法反审核")
  340. .toString();
  341. }
  342. }
  343. ArrayList<String> sqlList = new ArrayList<>();
  344. Rows rowsOrderDetail = dbConnect.runSqlQuery("select t1.undeliqty,t1.deliedqty,t1.qty,t1.sa_orderitemsid from sa_orderitems t1 where t1.sa_orderitemsid in (select sa_orderitemsid from sa_dispatch_items where sa_dispatchid="+ sa_dispatchid+")" );
  345. RowsMap rowsMap = rowsOrderDetail.toRowsMap("sa_orderitemsid");
  346. Rows rowsDispatchDetail = dbConnect.runSqlQuery("select t1.qty,t1.sa_orderitemsid,t1.rowno,t2.itemname from sa_dispatch_items t1 left join plm_item t2 on t1.itemid=t2.itemid and t1.siteid=t2.siteid where t1.sa_dispatchid=" + sa_dispatchid);
  347. if (!rowsDispatchDetail.isEmpty()) {
  348. for (Row row : rowsDispatchDetail) {
  349. // if(rowsMap.get(row.getLong("sa_orderitemsid")).isEmpty()) {
  350. // return getErrReturnObject().setErrMsg("行号为:【" + row.getString("rowno") + "】的发货单明细不存在对应得订单行,无法审核")
  351. // .toString();
  352. // }
  353. // if(row.getBigDecimal("qty").compareTo(rowsMap.get(row.getLong("sa_orderitemsid")).get(0).getBigDecimal("undeliqty"))==1) {
  354. // return getErrReturnObject().setErrMsg("行号为:【" + row.getString("rowno") + "】的发货单明细的数量大于对应订单行的未发货数量,无法审核")
  355. // .toString();
  356. // }
  357. sqlList.add("update sa_orderitems set undeliqty=" + rowsMap.get(row.getLong("sa_orderitemsid")).get(0).getBigDecimal("undeliqty").add(row.getBigDecimal("qty")) + ",deliedqty=" + rowsMap.get(row.getLong("sa_orderitemsid")).get(0).getBigDecimal("deliedqty").subtract(row.getBigDecimal("qty")) + " where sa_orderitemsid=" + row.getLong("sa_orderitemsid"));
  358. }
  359. }
  360. SQLFactory sqlFactoryupdate = new SQLFactory(this, "发货单反审核");
  361. sqlFactoryupdate.addParameter("siteid", siteid);
  362. sqlFactoryupdate.addParameter("sa_dispatchid", sa_dispatchid);
  363. sqlFactoryupdate.addParameter("checkby", username);
  364. sqlList.add(sqlFactoryupdate.getSQL());
  365. sqlList.add(DataContrlLog.createLog(this, "sa_dispatch", sa_dispatchid, "反审核", "发货单反审核成功").getSQL());
  366. dbConnect.runSqlUpdate(sqlList);
  367. return getSucReturnObject().toString();
  368. }
  369. @API(title = "手工关闭", apiversion = R.ID20230404134703.v1.class)
  370. @CACHEING_CLEAN(apiClass = {Order.class, OrderItems.class, restcontroller.sale.order.Order.class, dispatch.class, dispatchItems.class,cashbill.class})
  371. public String unclose() throws YosException {
  372. Long sa_dispatchid = content.getLong("sa_dispatchid");
  373. Long sa_orderid = 0L;
  374. Rows rows = dbConnect.runSqlQuery("select sa_dispatchid,status,billno,sa_orderid from sa_dispatch where sa_dispatchid ='"
  375. + sa_dispatchid + "' and siteid='" + siteid + "'");
  376. if (rows.isEmpty()) {
  377. return getErrReturnObject().setErrMsg("该发货单不存在")
  378. .toString();
  379. } else {
  380. sa_orderid = rows.get(0).getLong("sa_orderid");
  381. if (!rows.get(0).getString("status").equals("复核")) {
  382. return getErrReturnObject().setErrMsg("单号为:【" + rows.get(0).getString("billno") + "】的发货单为非复核状态,无法手工关闭")
  383. .toString();
  384. }
  385. }
  386. //对接erp生成erp发货单
  387. if (Parameter.get("system.ccerp_dockswitch").equalsIgnoreCase("true") && siteid.equalsIgnoreCase("ccyosg")) {
  388. ERPDocking erpDocking =new ERPDocking();
  389. String result =erpDocking.closeErpSainvoice(rows.get(0).getString("billno"),true,this,sa_dispatchid);
  390. if(!result.equals("true")){
  391. return getErrReturnObject().setErrMsg(result).toString();
  392. }else {
  393. JSONArray jsonArray = erpDocking.queryErpSainvoice(rows.get(0).getString("billno"));
  394. ArrayList<String> dispatchsqlList = new ArrayList<>();
  395. if(!jsonArray.isEmpty()){
  396. for (Object object1:jsonArray) {
  397. JSONObject jsonObject = (JSONObject)object1;
  398. dispatchsqlList.add("update sa_dispatch_items set outwarehouseqty="+jsonObject.getBigDecimalValue("fqty1")+" where rowno ="+jsonObject.getIntValue("frownum")+" and sa_dispatchid='"+sa_dispatchid+"' and siteid='"+siteid+"'");
  399. }
  400. }
  401. dbConnect.runSqlUpdate(dispatchsqlList);
  402. }
  403. }
  404. ArrayList<String> sqlList = new ArrayList<>();
  405. Rows rowsOrderDetail = dbConnect.runSqlQuery("select t1.undeliqty,t1.deliedqty,t1.qty,t1.sa_orderitemsid from sa_orderitems t1 where t1.sa_orderitemsid in (select sa_orderitemsid from sa_dispatch_items where sa_dispatchid="+ sa_dispatchid+")" );
  406. RowsMap rowsMap = rowsOrderDetail.toRowsMap("sa_orderitemsid");
  407. Rows rowsDispatchDetail = dbConnect.runSqlQuery("select t1.qty,t1.outwarehouseqty,t1.sa_orderitemsid,t1.rowno,t2.itemname from sa_dispatch_items t1 left join plm_item t2 on t1.itemid=t2.itemid and t1.siteid=t2.siteid where t1.sa_dispatchid=" + sa_dispatchid);
  408. if (!rowsDispatchDetail.isEmpty()) {
  409. for (Row row : rowsDispatchDetail) {
  410. // if(rowsMap.get(row.getLong("sa_orderitemsid")).isEmpty()) {
  411. // return getErrReturnObject().setErrMsg("行号为:【" + row.getString("rowno") + "】的发货单明细不存在对应得订单行,无法审核")
  412. // .toString();
  413. // }
  414. // if(row.getBigDecimal("qty").compareTo(rowsMap.get(row.getLong("sa_orderitemsid")).get(0).getBigDecimal("undeliqty"))==1) {
  415. // return getErrReturnObject().setErrMsg("行号为:【" + row.getString("rowno") + "】的发货单明细的数量大于对应订单行的未发货数量,无法审核")
  416. // .toString();
  417. // }
  418. sqlList.add("update sa_orderitems set undeliqty=" + rowsMap.get(row.getLong("sa_orderitemsid")).get(0).getBigDecimal("undeliqty").add(row.getBigDecimal("qty").subtract(row.getBigDecimal("outwarehouseqty"))) + ",deliedqty=" + rowsMap.get(row.getLong("sa_orderitemsid")).get(0).getBigDecimal("deliedqty").subtract(row.getBigDecimal("qty").subtract(row.getBigDecimal("outwarehouseqty"))) + " where sa_orderitemsid=" + row.getLong("sa_orderitemsid"));
  419. }
  420. }
  421. Rows orderRows =dbConnect.runSqlQuery("select distinct t1.sa_orderid from sa_orderitems t1 inner join sa_dispatch_items t2 on t1.siteid=t2.siteid and t1.sa_orderitemsid=t2.sa_orderitemsid where t1.siteid='" + siteid + "' and t2.sa_dispatchid=" + sa_dispatchid);
  422. for (Row row:orderRows) {
  423. dbConnect.runSqlUpdate("update sa_order set status='审核' where sa_orderid=" + row.getLong("sa_orderid") + " and siteid='" + siteid + "'");
  424. }
  425. SQLFactory sqlFactoryupdate = new SQLFactory(this, "发货单关闭");
  426. sqlFactoryupdate.addParameter("siteid", siteid);
  427. sqlFactoryupdate.addParameter("sa_dispatchid", sa_dispatchid);
  428. sqlFactoryupdate.addParameter("closeby", username);
  429. sqlList.add(sqlFactoryupdate.getSQL());
  430. sqlList.add(DataContrlLog.createLog(this, "sa_dispatch", sa_dispatchid, "手工关闭", "发货单手工关闭成功").getSQL());
  431. dbConnect.runSqlUpdate(sqlList);
  432. return getSucReturnObject().toString();
  433. }
  434. @API(title = "行关闭", apiversion = R.ID20230522093703.v1.class)
  435. @CACHEING_CLEAN(apiClass = {Order.class, OrderItems.class, restcontroller.sale.order.Order.class, dispatch.class, dispatchItems.class,cashbill.class})
  436. public String closeRows() throws YosException {
  437. JSONArray sa_dispatch_itemsids = content.getJSONArray("sa_dispatch_itemsids");
  438. BatchDeleteErr batchDeleteErr = BatchDeleteErr.create(this, sa_dispatch_itemsids.size());
  439. String sql ="";
  440. if(sa_dispatch_itemsids.size()>0){
  441. sql ="select t1.sa_dispatch_itemsid,t1.sa_orderitemsid,t1.qty,t1.outwarehouseqty,t1.sa_dispatchid,t1.rowno,t3.itemno,t2.billno,t2.status from sa_dispatch_items t1 left join sa_dispatch t2 on t1.sa_dispatchid=t2.sa_dispatchid and t1.siteid=t2.siteid left join plm_item t3 on t1.itemid=t3.itemid and t1.siteid=t3.siteid where t1.sa_dispatch_itemsid in" + sa_dispatch_itemsids.toJSONString() + " and t1.siteid='" + siteid + "'";
  442. sql = sql.replace("[", "(").replace("]", ")");
  443. }else {
  444. return getErrReturnObject().setErrMsg("请选择发货单行后,进行行关闭").toString();
  445. }
  446. Rows rows = dbConnect.runSqlQuery(sql);
  447. if (rows.isEmpty()) {
  448. return getErrReturnObject().setErrMsg("该发货单所选行不存在")
  449. .toString();
  450. } else {
  451. if (!rows.get(0).getString("status").equals("复核")) {
  452. return getErrReturnObject().setErrMsg("单号为:【" + rows.get(0).getString("billno") + "】的发货单为非复核状态,无法行关闭")
  453. .toString();
  454. }
  455. }
  456. ArrayList<String> sqlList = new ArrayList<>();
  457. String orderdetailSql="select t1.undeliqty,t1.deliedqty,t1.qty,t1.sa_orderitemsid from sa_orderitems t1 where t1.sa_orderitemsid in (select sa_orderitemsid from sa_dispatch_items where sa_dispatch_itemsid in" + sa_dispatch_itemsids.toJSONString() + " )";
  458. orderdetailSql = orderdetailSql.replace("[", "(").replace("]", ")");
  459. Rows rowsOrderDetail = dbConnect.runSqlQuery(orderdetailSql);
  460. RowsMap rowsMap = rowsOrderDetail.toRowsMap("sa_orderitemsid");
  461. for (Row row :rows) {
  462. //对接erp生成erp发货单
  463. if (Parameter.get("system.ccerp_dockswitch").equalsIgnoreCase("true") && siteid.equalsIgnoreCase("ccyosg")) {
  464. ERPDocking erpDocking =new ERPDocking();
  465. String result =erpDocking.closeErpSainvoiceRow(row.getString("billno"),this,row.getLong("rowno"),row.getString("itemno"),row.getLong("sa_dispatchid"));
  466. if(!result.equals("true")){
  467. batchDeleteErr.addErr(row.getLong("sa_dispatch_itemsid"), result);
  468. continue;
  469. }else {
  470. sqlList.add("update sa_dispatch_items set isclose=1 where sa_dispatch_itemsid="+row.getLong("sa_dispatch_itemsid"));
  471. sqlList.add("update sa_orderitems set undeliqty=" + rowsMap.get(row.getLong("sa_orderitemsid")).get(0).getBigDecimal("undeliqty").add(row.getBigDecimal("qty").subtract(row.getBigDecimal("outwarehouseqty"))) + ",deliedqty=" + rowsMap.get(row.getLong("sa_orderitemsid")).get(0).getBigDecimal("deliedqty").subtract(row.getBigDecimal("qty").subtract(row.getBigDecimal("outwarehouseqty"))) + " where sa_orderitemsid=" + row.getLong("sa_orderitemsid"));
  472. }
  473. }
  474. }
  475. dbConnect.runSqlUpdate(sqlList);
  476. Rows sumcountRows =dbConnect.runSqlQuery("select count(1) sumcount from sa_dispatch_items where sa_dispatchid="+rows.get(0).getLong("sa_dispatchid") +" and siteid='"+siteid+"'");
  477. Rows closecountRows =dbConnect.runSqlQuery("select count(1) closecount from sa_dispatch_items where sa_dispatchid="+rows.get(0).getLong("sa_dispatchid") +" and siteid='"+siteid+"' and isclose=1");
  478. if(sumcountRows.get(0).getLong("sumcount")==closecountRows.get(0).getLong("closecount")){
  479. if (Parameter.get("system.ccerp_dockswitch").equalsIgnoreCase("true") && siteid.equalsIgnoreCase("ccyosg")) {
  480. ERPDocking erpDocking =new ERPDocking();
  481. String result =erpDocking.closeErpSainvoice(rows.get(0).getString("billno"),true,this,rows.get(0).getLong("sa_dispatchid"));
  482. if(!result.equals("true")){
  483. return getErrReturnObject().setErrMsg(result).toString();
  484. }else {
  485. dbConnect.runSqlUpdate("update sa_dispatch set status='手工关闭',closeby='"+username+"',closedate=CURRENT_TIMESTAMP where sa_dispatchid="+rows.get(0).getLong("sa_dispatchid"));
  486. dbConnect.runSqlUpdate(DataContrlLog.createLog(this, "sa_dispatch", rows.get(0).getLong("sa_dispatchid"), "手工关闭", "发货单手工关闭成功").getSQL());
  487. }
  488. }
  489. }
  490. return batchDeleteErr.getReturnObject().toString();
  491. }
  492. @API(title = "自动关闭(erp调用)", apiversion = R.ID20230413110103.v1.class,accesstoken = false)
  493. @CACHEING_CLEAN(apiClass = {Order.class, OrderItems.class, restcontroller.sale.order.Order.class, dispatch.class, dispatchItems.class,cashbill.class})
  494. public String autoClose() throws YosException {
  495. String finvonum = content.getString("finvonum");
  496. Rows rows = dbConnect.runSqlQuery("select * from sa_dispatch where status='复核' and siteid='CCYOSG' and billno='"+finvonum+"'");
  497. Rows rowsdetail = dbConnect.runSqlQuery("select t1.* from sa_dispatch_items t1 inner join sa_dispatch t2 on t1.sa_dispatchid=t2.sa_dispatchid and t1.siteid=t2.siteid where t2.status='复核' and t1.siteid='CCYOSG'");
  498. RowsMap rowsMap = rowsdetail.toRowsMap("sa_dispatchid");
  499. ArrayList<String> sqlList = new ArrayList<>();
  500. ERPDocking erpDocking =new ERPDocking();
  501. for (Row row : rows) {
  502. String sa_dispatchid = row.getString("sa_dispatchid");
  503. String billno = row.getString("billno");
  504. String result =erpDocking.closeErpSainvoice(billno,false,this, row.getLong("sa_dispatchid"));
  505. if(result.equals("true")){
  506. sqlList.add("update sa_dispatch set status='关闭' where sa_dispatchid='"+sa_dispatchid+"' and siteid='CCYOSG'");
  507. SQLFactory sqlFactory = new SQLFactory(new DataContrlLog(), "数据操作日志新增");
  508. sqlFactory.addParameter("ownertable", "sa_dispatch");
  509. sqlFactory.addParameter("ownerid", sa_dispatchid);
  510. sqlFactory.addParameter("action", "自动关闭");
  511. sqlFactory.addParameter("remarks", "发货单自动关闭成功");
  512. sqlFactory.addParameter("actionuserid", "1");
  513. sqlFactory.addParameter("actionby", "admin");
  514. sqlFactory.addParameter("siteid", "CCYOSG");
  515. sqlList.add(sqlFactory.getSQL());
  516. }else {
  517. logger.info("发货单自动关闭错误:"+result);
  518. return getErrReturnObject().setErrMsg(result).toString();
  519. }
  520. JSONArray jsonArray = erpDocking.queryErpSainvoice(billno);
  521. if(!jsonArray.isEmpty()){
  522. for (Object object:jsonArray) {
  523. JSONObject jsonObject = (JSONObject)object;
  524. sqlList.add("update sa_dispatch_items set outwarehouseqty="+jsonObject.getBigDecimalValue("fqty1")+" where rowno ="+jsonObject.getIntValue("frownum")+" and sa_dispatchid='"+sa_dispatchid+"' and siteid='CCYOSG'");
  525. }
  526. }
  527. }
  528. dbConnect.runSqlUpdate(sqlList);
  529. return getSucReturnObject().toString();
  530. }
  531. @API(title = "复核", apiversion = R.ID20221114135803.v1.class)
  532. @CACHEING_CLEAN(apiClass = {Order.class, OrderItems.class, restcontroller.sale.order.Order.class, dispatch.class, dispatchItems.class,cashbill.class})
  533. public String recheck() throws YosException {
  534. Long sa_dispatchid = content.getLong("sa_dispatchid");
  535. Rows dispatchRows = dbConnect.runSqlQuery("select sa_dispatchid,status,billno,sa_orderid from sa_dispatch where sa_dispatchid ='"
  536. + sa_dispatchid + "' and siteid='" + siteid + "'");
  537. if (dispatchRows.isEmpty()) {
  538. return getErrReturnObject().setErrMsg("该发货单不存在")
  539. .toString();
  540. } else {
  541. if (!dispatchRows.get(0).getString("status").equals("新建")) {
  542. return getErrReturnObject().setErrMsg("单号为:【" + dispatchRows.get(0).getString("billno") + "】的发货单为非新建状态,无法复核")
  543. .toString();
  544. }
  545. }
  546. ArrayList<String> sqlList = new ArrayList<>();
  547. Rows rowsOrderDetail = dbConnect.runSqlQuery("select t1.undeliqty,t1.deliedqty,t1.qty,t1.sa_orderitemsid from sa_orderitems t1 where t1.sa_orderitemsid in (select sa_orderitemsid from sa_dispatch_items where sa_dispatchid="+ sa_dispatchid+")" );
  548. RowsMap rowsMap = rowsOrderDetail.toRowsMap("sa_orderitemsid");
  549. Rows rowsDispatchDetail = dbConnect.runSqlQuery("select t1.qty,t1.sa_orderitemsid,t1.rowno,t2.itemname from sa_dispatch_items t1 left join plm_item t2 on t1.itemid=t2.itemid and t1.siteid=t2.siteid where t1.sa_dispatchid=" + sa_dispatchid);
  550. if (!rowsDispatchDetail.isEmpty()) {
  551. for (Row row : rowsDispatchDetail) {
  552. if (rowsMap.get(row.getString("sa_orderitemsid")).isEmpty()) {
  553. return getErrReturnObject().setErrMsg("行号为:【" + row.getString("rowno") + "】的发货单明细不存在对应得订单行,无法复核")
  554. .toString();
  555. }
  556. if (row.getBigDecimal("qty").compareTo(rowsMap.get(row.getString("sa_orderitemsid")).get(0).getBigDecimal("undeliqty")) == 1) {
  557. return getErrReturnObject().setErrMsg("行号为:【" + row.getString("rowno") + "】的发货单明细的数量大于对应订单行的未发货数量,无法复核")
  558. .toString();
  559. }
  560. sqlList.add("update sa_orderitems set undeliqty=" + rowsMap.get(row.getLong("sa_orderitemsid")).get(0).getBigDecimal("undeliqty").subtract(row.getBigDecimal("qty")) + ",deliedqty=" + (row.getBigDecimal("qty").add(rowsMap.get(row.getLong("sa_orderitemsid")).get(0).getBigDecimal("deliedqty"))) + " where sa_orderitemsid=" + row.getLong("sa_orderitemsid"));
  561. }
  562. }else {
  563. return getErrReturnObject().setErrMsg("该发货单明细不存在,无法复核").toString();
  564. }
  565. Rows rows = dbConnect.runSqlQuery("select t1.*,t3.agentnum,t2.enterprisename,t4.sonum,t5.name,t5.phonenumber,t5.address from sa_dispatch t1 left join sys_enterprise t2 on t1.sys_enterpriseid=t2.sys_enterpriseid and t1.siteid=t2.siteid left join sa_agents t3 on t1.sys_enterpriseid=t3.sys_enterpriseid and t1.siteid=t3.siteid left join sa_order t4 on t1.sa_orderid=t4.sa_orderid and t1.siteid=t4.siteid left join sys_enterprise_contacts t5 on t1.rec_contactsid=t5.contactsid and t1.siteid=t5.siteid where t1.sa_dispatchid ='"
  566. + sa_dispatchid + "' and t1.siteid='" + siteid + "'");
  567. Rows rowsdetail = dbConnect.runSqlQuery("select t3.sonum,t2.rowno sorowno,t4.itemno,t1.batchno,t1.rowno,t1.qty,t2.price,t1.remarks from sa_dispatch_items t1 left join sa_orderitems t2 on t1.sa_orderitemsid=t2.sa_orderitemsid and t1.siteid=t2.siteid left join sa_order t3 on t2.sa_orderid=t3.sa_orderid and t2.siteid=t3.siteid left join plm_item t4 on t1.itemid=t4.itemid and t1.siteid=t4.siteid where t1.sa_dispatchid ='"
  568. + sa_dispatchid + "' and t1.siteid='" + siteid + "'");
  569. SQLFactory sqlFactoryupdate = new SQLFactory(this, "发货单复核");
  570. Rows orderRows =dbConnect.runSqlQuery("select distinct t1.sa_orderid from sa_orderitems t1 inner join sa_dispatch_items t2 on t1.siteid=t2.siteid and t1.sa_orderitemsid=t2.sa_orderitemsid where t1.siteid='" + siteid + "' and t2.sa_dispatchid=" + sa_dispatchid);
  571. if(orderRows.size()==1){
  572. sqlList.add("update sa_dispatch set sa_orderid="+orderRows.get(0).getLong("sa_orderid")+" where siteid='" + siteid + "' and sa_dispatchid=" + sa_dispatchid);
  573. }
  574. //对接erp生成erp发货单
  575. if (Parameter.get("system.ccerp_dockswitch").equalsIgnoreCase("true") && siteid.equalsIgnoreCase("ccyosg")) {
  576. ERPDocking erpDocking =new ERPDocking();
  577. String result =erpDocking.createErpSainvoice(rows.get(0),rowsdetail,this,sa_dispatchid);
  578. if(!result.equals("true")){
  579. System.out.println(result);
  580. return getErrReturnObject().setErrMsg(result).toString();
  581. }
  582. }
  583. // //判断当前订单是否已发完货,如果发完,则生把订单变为关闭状态
  584. // //总数量
  585. // Rows totalRows = dbConnect.runSqlQuery("select count(1) count,sa_orderid from sa_orderitems where siteid='" + siteid + "' group by sa_orderid");
  586. // RowsMap totalRowsMap=totalRows.toRowsMap("sa_orderid");
  587. // //已发完数量
  588. // Rows deliRows = dbConnect.runSqlQuery("select count(1) count,sa_orderid from sa_orderitems where undeliqty=0 and siteid='" + siteid + "' group by sa_orderid");
  589. // RowsMap deliRowsMap=deliRows.toRowsMap("sa_orderid");
  590. // for (Row row:orderRows) {
  591. // if(totalRowsMap.containsKey(row.getString("sa_orderid")) && deliRowsMap.containsKey(row.getString("sa_orderid"))){
  592. // if (totalRowsMap.get(row.getString("sa_orderid")).get(0).getLong("count") ==deliRowsMap.get(row.getString("sa_orderid")).get(0).getLong("count")) {
  593. // dbConnect.runSqlUpdate("update sa_order set status='关闭' where sa_orderid=" + row.getLong("sa_orderid") + " and siteid='" + siteid + "'");
  594. // }
  595. // }
  596. // }
  597. Executor.sendEml(this, "dispatchreccheck", sa_dispatchid,new ArrayList<>());
  598. sqlList.add(DataContrlLog.createLog(this, "sa_dispatch", sa_dispatchid, "复核", "发货单复核成功").getSQL());
  599. sqlFactoryupdate.addParameter("siteid", siteid);
  600. sqlFactoryupdate.addParameter("sa_dispatchid", sa_dispatchid);
  601. sqlFactoryupdate.addParameter("recheckby", username);
  602. sqlList.add(sqlFactoryupdate.getSQL());
  603. dbConnect.runSqlUpdate(sqlList);
  604. Long sys_enterpriseid = rows.get(0).getLong("sys_enterpriseid");
  605. String message = "您的发货单"+rows.get(0).getString("billno")+"已复核,请及时查看!";
  606. sendMsg(message, sa_dispatchid, sys_enterpriseid);
  607. return getSucReturnObject().toString();
  608. }
  609. @API(title = "一键生成发货单", apiversion = R.ID20230220100604.v1.class)
  610. @CACHEING_CLEAN(apiversions = {R.ID20221114135303.v1.class, R.ID20221114135403.v1.class, R.ID20230320160203.v1.class})
  611. public String generatedispatch() throws YosException {
  612. Long sa_orderid = content.getLong("sa_orderid");
  613. JSONArray sa_orderitemsids = content.getJSONArray("sa_orderitemsids");
  614. Rows orderRows = dbConnect.runSqlQuery("select freightstatus,sys_enterpriseid,rec_contactsid,status,remarks from sa_order where siteid='" + siteid + "' and sa_orderid=" + sa_orderid);
  615. if (orderRows.isEmpty()) {
  616. return getErrReturnObject().setErrMsg("订单无效").toString();
  617. }
  618. if (!orderRows.get(0).getString("status").equals("审核") && !orderRows.get(0).getString("status").equals("关闭")) {
  619. return getErrReturnObject().setErrMsg("非审核后订单无法生成发货单").toString();
  620. }
  621. ArrayList<String> sqlList = new ArrayList<>();
  622. long sa_dispatchid = createTableID("sa_dispatch");
  623. String billCode = createBillCode("dispatchbill");
  624. SQLFactory sqlFactory = new SQLFactory(this, "发货单新增");
  625. sqlFactory.addParameter("siteid", siteid);
  626. sqlFactory.addParameter("userid", userid);
  627. sqlFactory.addParameter("username", username);
  628. sqlFactory.addParameter("sa_dispatchid", sa_dispatchid);
  629. sqlFactory.addParameter("billno", billCode);
  630. sqlFactory.addParameter("sys_enterpriseid", orderRows.get(0).getLong("sys_enterpriseid"));
  631. sqlFactory.addParameter("rec_contactsid", orderRows.get(0).getLong("rec_contactsid"));
  632. //sqlFactory.addParameter("sa_logiscompid", orderRows.get(0).getLong("sa_logiscompid"));
  633. sqlFactory.addParameter("sa_orderid", sa_orderid);
  634. sqlFactory.addParameter("remarks", orderRows.get(0).getString("remarks"));
  635. sqlFactory.addParameter("freightstatus", orderRows.get(0).getString("freightstatus"));
  636. sqlFactory.addParameter("billdate", now());
  637. sqlList.add(sqlFactory.getSQL());
  638. RowsMap orderitemsRowsMap = dbConnect.runSqlQuery("select itemid,itemno,qty,sa_orderitemsid,sa_orderid,remarks from sa_orderitems where isfreeze=0 and siteid='" + siteid + "' and sa_orderid=" + sa_orderid).toRowsMap("sa_orderitemsid");
  639. RowsMap dispatchitemsRowsMap;
  640. if (dbConnect.runSqlQuery("select 1 from sys_site_parameter where siteid='" + siteid + "' and dispatch_recheck=1").isEmpty()) {
  641. dispatchitemsRowsMap = dbConnect.runSqlQuery("select sa_orderid,sa_orderitemsid,ifnull(sum(qty),0) qty from sa_dispatch t1 inner join sa_dispatch_items t2 on t1.siteid=t2.siteid and t1.sa_dispatchid=t2.sa_dispatchid where t1.siteid='" + siteid + "' and t1.status in ('审核','关闭') group by t1.sa_orderid,t2.sa_orderitemsid").toRowsMap("sa_orderitemsid");
  642. } else {
  643. dispatchitemsRowsMap = dbConnect.runSqlQuery("select sa_orderid,sa_orderitemsid,ifnull(sum(qty),0) qty from sa_dispatch t1 inner join sa_dispatch_items t2 on t1.siteid=t2.siteid and t1.sa_dispatchid=t2.sa_dispatchid where t1.siteid='" + siteid + "' and t1.status in ('复核','关闭') group by t1.sa_orderid,t2.sa_orderitemsid").toRowsMap("sa_orderitemsid");
  644. }
  645. Long rowno = 1L;
  646. for (Object o : sa_orderitemsids) {
  647. String sa_orderitemsid = o.toString();
  648. BigDecimal qty = new BigDecimal("0");
  649. if (orderitemsRowsMap.containsKey(sa_orderitemsid)) {
  650. Rows orderitemsRows = orderitemsRowsMap.get(sa_orderitemsid);
  651. qty = orderitemsRows.get(0).getBigDecimal("qty");
  652. if (dispatchitemsRowsMap.containsKey(sa_orderitemsid)) {
  653. RowsMap dispatchRowsMap = dispatchitemsRowsMap.get(sa_orderitemsid).toRowsMap("sa_orderid");
  654. if (dispatchRowsMap.containsKey(sa_orderid.toString())) {
  655. Rows orderitemRows = dispatchRowsMap.get(sa_orderid.toString());
  656. if (orderitemsRows.get(0).getBigDecimal("qty").compareTo(orderitemRows.get(0).getBigDecimal("qty")) < 1) {
  657. continue;
  658. } else {
  659. qty = qty.subtract(orderitemRows.get(0).getBigDecimal("qty"));
  660. }
  661. }
  662. }
  663. sqlFactory = new SQLFactory(this, "发货单明细新增");
  664. sqlFactory.addParameter("siteid", siteid);
  665. sqlFactory.addParameter("sa_dispatch_itemsid", createTableID("sa_dispatch_items"));
  666. sqlFactory.addParameter("sa_dispatchid", sa_dispatchid);
  667. sqlFactory.addParameter("rowno", rowno);
  668. sqlFactory.addParameter("billno", billCode);
  669. rowno++;
  670. sqlFactory.addParameter("sa_orderitemsid", sa_orderitemsid);
  671. sqlFactory.addParameter("itemid", orderitemsRows.get(0).getLong("itemid"));
  672. sqlFactory.addParameter("qty", qty);
  673. sqlFactory.addParameter("batchcontrol", 0);
  674. sqlFactory.addParameter("batchno", "");
  675. sqlFactory.addParameter("remarks", orderRows.get(0).getString("remarks"));
  676. sqlFactory.addParameter("userid", userid);
  677. sqlFactory.addParameter("username", username);
  678. sqlList.add(sqlFactory.getSQL());
  679. }
  680. }
  681. dbConnect.runSqlUpdate(sqlList);
  682. content.put("sa_dispatchid", sa_dispatchid);
  683. return queryDispatchMain();
  684. }
  685. public void sendMsg(String content, Long sa_dispatchid, Long sys_enterpriseid) throws YosException {
  686. ArrayList<Long> userList = getEnterpriseHrs(sys_enterpriseid).toArrayList("userid", new ArrayList<>());
  687. Remind remind = new Remind(this);
  688. remind.setTitle("发货单消息");
  689. remind.setContent(content);
  690. remind.setType("应用");
  691. remind.setObjectid(sa_dispatchid);
  692. remind.setObjectname("sa_dispatch");
  693. remind.setTouserid(userList);
  694. remind.sendByDialogMsg().createSys_message();
  695. }
  696. @API(title = "查询erp对接记录", apiversion = R.ID20230228133403.v1.class)
  697. @CACHEING
  698. public String queryErpupdatelog() throws YosException {
  699. Long sa_dispatchid = content.getLong("sa_dispatchid");
  700. SQLFactory sqlFactory = new SQLFactory(this, "发货单erp对接记录", pageSize, pageNumber, pageSorting);
  701. sqlFactory.addParameter("siteid", siteid);
  702. sqlFactory.addParameter("sa_dispatchid", sa_dispatchid);
  703. Rows rows = dbConnect.runSqlQuery(sqlFactory.getSQL());
  704. return getSucReturnObject().setData(rows).toString();
  705. }
  706. }