stockbill.java 44 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778
  1. package restcontroller.webmanage.sale.stockbill;
  2. import beans.accountbalance.Accountbalance;
  3. import beans.accountbalance.CashbillEntity;
  4. import beans.data.BatchDeleteErr;
  5. import beans.datacontrllog.DataContrlLog;
  6. import beans.dispatch.Dispatch;
  7. import beans.invbal.Invbal;
  8. import beans.parameter.Parameter;
  9. import com.alibaba.fastjson.JSONArray;
  10. import com.alibaba.fastjson.JSONObject;
  11. import common.Controller;
  12. import common.YosException;
  13. import common.annotation.API;
  14. import common.annotation.CACHEING;
  15. import common.annotation.CACHEING_CLEAN;
  16. import common.data.*;
  17. import org.apache.commons.lang.StringUtils;
  18. import restcontroller.R;
  19. import restcontroller.webmanage.sale.order.Order;
  20. import restcontroller.webmanage.sale.order.OrderItems;
  21. import javax.swing.text.StyledEditorKit;
  22. import java.math.BigDecimal;
  23. import java.text.SimpleDateFormat;
  24. import java.util.ArrayList;
  25. import java.util.Date;
  26. import java.util.HashMap;
  27. import java.util.List;
  28. import static java.time.LocalDate.now;
  29. /**
  30. * 出入库单
  31. */
  32. @API(title = "出入库单")
  33. public class stockbill extends Controller {
  34. /**
  35. * 构造函数
  36. *
  37. * @param content
  38. */
  39. public stockbill(JSONObject content) throws YosException {
  40. super(content);
  41. }
  42. @API(title = "新增销售出库单", apiversion = R.ID2025043010105603.v1.class)
  43. @CACHEING_CLEAN(apiClass = {stockbill.class, stockbillitems.class})
  44. public String insertormodify_stockbill() throws YosException {
  45. ArrayList<String> sqlList = new ArrayList<>();
  46. // 表名
  47. String tableName = "st_stockbill";
  48. Long st_stockbillid = content.getLong("st_stockbillid");
  49. Long sys_enterpriseid = content.getLong("sys_enterpriseid");
  50. Rows contactrows =dbConnect.runSqlQuery("select * from sys_enterprise_contacts where sys_enterpriseid="+sys_enterpriseid+" and ifnull(deleted,0)=0");
  51. Long rec_contactsid=content.getLongValue("rec_contactsid");
  52. if(contactrows.isNotEmpty()){
  53. rec_contactsid = contactrows.get(0).getLong("contactsid");
  54. }
  55. Long departmentid = content.getLongValue("departmentid");
  56. String type = content.getStringValue("type");
  57. String typemx = content.getStringValue("typemx");
  58. String remarks = content.getStringValue("remarks");
  59. String billdate = content.getStringValue("billdate");
  60. String outplace = content.getStringValue("outplace");
  61. String delivery = content.getStringValue("delivery");
  62. Rows invoicerows =dbConnect.runSqlQuery("select * from sys_enterprise_finance where sys_enterpriseid="+sys_enterpriseid+" order by isdefault desc");
  63. String invoice_enterprisename = content.getStringValue("invoice_enterprisename");
  64. String invoice_address = content.getStringValue("invoice_address");
  65. String invoice_taxno = content.getStringValue("invoice_taxno");
  66. if(invoicerows.isNotEmpty()){
  67. invoice_enterprisename=invoicerows.get(0).getString("enterprisename");
  68. invoice_address=invoicerows.get(0).getString("address");
  69. invoice_taxno=invoicerows.get(0).getString("taxno");
  70. }
  71. String tracknumber = content.getStringValue("tracknumber");
  72. boolean isconfirm = content.getBooleanValue("isconfirm");
  73. SQLFactory sqlFactory = new SQLFactory(this, "发货单新增");
  74. if (st_stockbillid <= 0) {
  75. st_stockbillid = createTableID(tableName);
  76. InsertSQL insertSQL = SQLFactory.createInsertSQL(this, tableName);
  77. insertSQL.setUniqueid(st_stockbillid);
  78. insertSQL.setSiteid(siteid);
  79. insertSQL.setValue("sys_enterpriseid", sys_enterpriseid);
  80. insertSQL.setValue("rec_contactsid", rec_contactsid);
  81. insertSQL.setValue("departmentid", departmentid);
  82. insertSQL.setValue("type", type);
  83. insertSQL.setValue("typemx", typemx);
  84. insertSQL.setValue("remarks", remarks);
  85. insertSQL.setValue("billdate", billdate);
  86. insertSQL.setValue("billno", createBillCode("stockbill"));
  87. insertSQL.setValue("outplace", outplace);
  88. insertSQL.setValue("delivery", delivery);
  89. insertSQL.setValue("invoice_enterprisename", invoice_enterprisename);
  90. insertSQL.setValue("invoice_address", invoice_address);
  91. insertSQL.setValue("invoice_taxno", invoice_taxno);
  92. insertSQL.setValue("tracknumber", tracknumber);
  93. insertSQL.setValue("isconfirm", isconfirm);
  94. insertSQL.setValue("period", content.getStringValue("period"));
  95. insertSQL.setValue("createby", username);
  96. insertSQL.setDateValue("createdate");
  97. insertSQL.setValue("changeby", username);
  98. insertSQL.setDateValue("changedate");
  99. insertSQL.setValue("status", "新建");
  100. insertSQL.setValue("payamount", 0);
  101. insertSQL.setValue("paydiscountamount", 0);
  102. sqlList.add(insertSQL.getSQL());
  103. sqlList.add(DataContrlLog.createLog(this, "st_stockbill", st_stockbillid, "新增", "销售出库单新增成功").getSQL());
  104. } else {
  105. Rows rows = dbConnect.runSqlQuery(
  106. "SELECT status,sys_enterpriseid from st_stockbill WHERE st_stockbillid = "
  107. + st_stockbillid);
  108. if (rows.isNotEmpty()) {
  109. if (rows.get(0).getString("status").equals("新建")) {
  110. UpdateSQL updateSQL = SQLFactory.createUpdateSQL(this, tableName);
  111. updateSQL.setUniqueid(st_stockbillid);
  112. updateSQL.setSiteid(siteid);
  113. updateSQL.setValue("sys_enterpriseid", sys_enterpriseid);
  114. updateSQL.setValue("rec_contactsid", rec_contactsid);
  115. updateSQL.setValue("departmentid", departmentid);
  116. updateSQL.setValue("remarks", remarks);
  117. updateSQL.setValue("billdate", billdate);
  118. updateSQL.setValue("outplace", outplace);
  119. updateSQL.setValue("delivery", delivery);
  120. updateSQL.setValue("invoice_enterprisename", content.getStringValue("invoice_enterprisename"));
  121. updateSQL.setValue("invoice_address", content.getStringValue("invoice_address"));
  122. updateSQL.setValue("invoice_taxno", content.getStringValue("invoice_taxno"));
  123. updateSQL.setValue("tracknumber", tracknumber);
  124. updateSQL.setValue("isconfirm", isconfirm);
  125. updateSQL.setValue("payamount", content.getBigDecimal("payamount"));
  126. updateSQL.setValue("paydiscountamount", content.getBigDecimal("paydiscountamount"));
  127. updateSQL.setValue("period", content.getStringValue("period"));
  128. updateSQL.setValue("changeby", username);
  129. updateSQL.setDateValue("changedate");
  130. sqlList.add(updateSQL.getSQL());
  131. sqlList.add(DataContrlLog.createLog(this, "st_stockbill", st_stockbillid, "更新", "销售出库单更新成功").getSQL());
  132. } else {
  133. return getErrReturnObject().setErrMsg("非新建状态下无法编辑").toString();
  134. }
  135. } else {
  136. return getErrReturnObject().setErrMsg("该销售出库单不存在").toString();
  137. }
  138. }
  139. dbConnect.runSqlUpdate(sqlList);
  140. content.put("st_stockbillid", st_stockbillid);
  141. return queryStockbillMain();
  142. }
  143. @API(title = "出入库单详情", apiversion = R.ID20230719153803.v1.class)
  144. @CACHEING
  145. public String queryStockbillMain() throws YosException {
  146. Long st_stockbillid = content.getLong("st_stockbillid");
  147. SQLFactory sqlFactory = new SQLFactory(this, "出入库单详情");
  148. sqlFactory.addParameter("st_stockbillid", st_stockbillid);
  149. sqlFactory.addParameter("siteid", siteid);
  150. Rows rows = dbConnect.runSqlQuery(sqlFactory);
  151. Row row = rows.isNotEmpty() ? rows.get(0) : new Row();
  152. Rows rowsdetail = dbConnect.runSqlQuery("select amount from st_stockbill_items where st_stockbillid="+st_stockbillid);
  153. row.put("receivableamount",rowsdetail.sum("amount"));
  154. return getSucReturnObject().setData(row).toString();
  155. }
  156. @API(title = "查询出入库单列表", apiversion = R.ID20230719153903.v1.class)
  157. @CACHEING
  158. public String queryStockbillList() throws YosException {
  159. StringBuffer where = new StringBuffer(" 1=1 ");
  160. if (content.containsKey("where")) {
  161. JSONObject whereObject = content.getJSONObject("where");
  162. if (whereObject.containsKey("condition") && !"".equals(whereObject.getString("condition"))) {
  163. where.append(" and(");
  164. where.append("t1.billno like'%").append(whereObject.getString("condition")).append("%' ");
  165. where.append("or t1.outplace like'%").append(whereObject.getString("condition")).append("%' ");
  166. where.append("or t3.agentnum like'%").append(whereObject.getString("condition")).append("%' ");
  167. where.append("or t2.enterprisename like'%").append(whereObject.getString("condition")).append("%' ");
  168. where.append("or t6.depname like'%").append(whereObject.getString("condition")).append("%' ");
  169. where.append(")");
  170. }
  171. if (whereObject.containsKey("type") && !"".equals(whereObject.getString("type"))) {
  172. where.append(" and t1.type ='").append(whereObject.getString("type")).append("' ");
  173. }
  174. if (whereObject.containsKey("typemx") && !"".equals(whereObject.getString("typemx"))) {
  175. where.append(" and t1.typemx ='").append(whereObject.getString("typemx")).append("' ");
  176. }
  177. if (whereObject.containsKey("status") && !"".equals(whereObject.getString("status"))) {
  178. where.append(" and t1.status ='").append(whereObject.getString("status")).append("' ");
  179. }
  180. if (whereObject.containsKey("rb") && !"".equals(whereObject.getString("rb"))) {
  181. where.append(" and t1.rb ='").append(whereObject.getString("rb")).append("' ");
  182. }
  183. if (whereObject.containsKey("begindate") && !"".equals(whereObject.getString("begindate"))) {
  184. where.append(" and DATE_FORMAT(t1.billdate, '%Y-%m-%d') >='").append(whereObject.getString("begindate")).append("' ");
  185. }
  186. if (whereObject.containsKey("enddate") && !"".equals(whereObject.getString("enddate"))) {
  187. where.append(" and DATE_FORMAT(t1.billdate, '%Y-%m-%d') <='").append(whereObject.getString("enddate")).append("' ");
  188. }
  189. if (whereObject.containsKey("remarks") && !"".equals(whereObject.getString("remarks"))) {
  190. where.append("and t1.remarks like'%").append(whereObject.getString("remarks")).append("%' ");
  191. }
  192. if (whereObject.containsKey("dateinterval") && !"".equals(whereObject.getString("dateinterval"))) {
  193. if(whereObject.getString("dateinterval").equals("past30days")){
  194. where.append("and DATE_FORMAT(t1.billdate, '%Y-%m-%d') >=DATE_SUB(CURDATE(), INTERVAL 30 DAY)");
  195. } else if (whereObject.getString("dateinterval").equals("past15days")) {
  196. where.append("and DATE_FORMAT(t1.billdate, '%Y-%m-%d') >=DATE_SUB(CURDATE(), INTERVAL 15 DAY)");
  197. }else if (whereObject.getString("dateinterval").equals("today")) {
  198. where.append("and DATE_FORMAT(t1.billdate, '%Y-%m-%d') >=CURDATE()");
  199. }
  200. }
  201. if (whereObject.containsKey("checknoprint") && !"".equals(whereObject.getString("checknoprint"))) {
  202. if(whereObject.getBooleanValue("checknoprint")){
  203. where.append("and t1.status ='审核' and isreport=0");
  204. }
  205. }
  206. if (whereObject.containsKey("nowaybillgenerated") && !"".equals(whereObject.getString("nowaybillgenerated"))) {
  207. if(whereObject.getBooleanValue("checknoprint")){
  208. where.append("and t1.isreceiver=0 and ifnull(txlogisticid,'')='' ");
  209. }
  210. }
  211. if (whereObject.containsKey("paynocheck") && !"".equals(whereObject.getString("paynocheck"))) {
  212. where.append("and t1.status ='新建' and delivery='到付'");
  213. }
  214. if (whereObject.containsKey("param") && !"".equals(whereObject.getString("param"))) {
  215. Rows rowsStockbillid = dbConnect.runSqlQuery("select t1.st_stockbillid from st_stockbill_items t1 left join plm_item t2 on t1.itemid=t2.itemid and t1.siteid=t2.siteid " +
  216. " where t1.siteid='" + siteid + "' and (t2.itemname like '%" + whereObject.getString("param") + "%' or t2.itemno like '%" + whereObject.getString("param") + "%')");
  217. if (rowsStockbillid.toJsonArray("st_stockbillid").isEmpty()) {
  218. where.append(" and t1.st_stockbillid in (0)");
  219. } else {
  220. String str = rowsStockbillid.toJsonArray("st_stockbillid").toJSONString();
  221. str = str.replace("[", "(").replace("]", ")");
  222. where.append(" and t1.st_stockbillid in").append(str);
  223. }
  224. }
  225. }
  226. // SQLFactory sqlFactory = new SQLFactory(this, "出入库单列表查询", pageSize, pageNumber, pageSorting);
  227. // sqlFactory.addParameter("siteid", siteid);
  228. // sqlFactory.addParameter_SQL("where", where);
  229. // Rows rows = dbConnect.runSqlQuery(sqlFactory);
  230. QuerySQL querySQL = queryStockbillList(where.toString());
  231. querySQL.setPage(pageSize, pageNumber);
  232. querySQL.setOrderBy(pageSorting);
  233. Rows rows = querySQL.query();
  234. return getSucReturnObject().setData(rows).toString();
  235. }
  236. //查询出入库单列表
  237. public QuerySQL queryStockbillList(String where) throws YosException {
  238. QuerySQL querySQL = SQLFactory.createQuerySQL(this, "st_stockbill","*");
  239. querySQL.setTableAlias("t1");
  240. querySQL.addJoinTable(JOINTYPE.left, "sys_enterprise", "t2", "t1.sys_enterpriseid = t2.sys_enterpriseid AND t1.siteid = t2.siteid",
  241. "enterprisename", "abbreviation");
  242. querySQL.addJoinTable(JOINTYPE.left, "sa_agents", "t3", "t1.sys_enterpriseid = t3.sys_enterpriseid AND t1.siteid = t3.siteid",
  243. "agentnum");
  244. querySQL.addJoinTable(JOINTYPE.left, "sys_enterprise_contacts", "t4", "t1.rec_contactsid=t4.contactsid and t1.siteid = t4.siteid");
  245. querySQL.addJoinTable(JOINTYPE.left, "sa_accountbalance", "t5", "t5.sys_enterpriseid=t1.sys_enterpriseid and t1.siteid = t5.siteid and t5.sa_accountclassid =(select t1.sa_accountclassid from sa_accountclass t1 where t1.siteid='"+siteid+"' and t1.accountname='现金账户')",
  246. "discountamount");
  247. querySQL.addJoinTable(JOINTYPE.left, "sys_department", "t6", "t1.departmentid=t6.departmentid and t1.siteid = t6.siteid",
  248. "depno","depname");
  249. querySQL.addQueryFields("recname", "t4.name");
  250. querySQL.addQueryFields("recphonenumber", "t4.phonenumber");
  251. querySQL.addQueryFields("recaddress", "t4.address");
  252. querySQL.setWhere("t1.siteid", siteid);
  253. querySQL.setWhere(where);
  254. return querySQL;
  255. }
  256. @API(title = "删除", apiversion = R.ID20230719154003.v1.class)
  257. @CACHEING_CLEAN(apiClass = {stockbill.class, stockbillitems.class})
  258. public String delete() throws YosException {
  259. JSONArray st_stockbillids = content.getJSONArray("st_stockbillids");
  260. BatchDeleteErr batchDeleteErr = BatchDeleteErr.create(this, st_stockbillids.size());
  261. for (Object o : st_stockbillids) {
  262. long st_stockbillid = Long.parseLong(o.toString());
  263. Rows RowsStatus = dbConnect.runSqlQuery("select st_stockbillid,status from st_stockbill where siteid='"
  264. + siteid + "' and st_stockbillid='" + st_stockbillid + "'");
  265. if (RowsStatus.isNotEmpty()) {
  266. if (!RowsStatus.get(0).getString("status").equals("新建")) {
  267. batchDeleteErr.addErr(st_stockbillid, "非新建状态的出入库单无法删除");
  268. continue;
  269. }
  270. }
  271. dbConnect.runSqlUpdate(
  272. "delete from st_stockbill where siteid='" + siteid + "' and st_stockbillid=" + st_stockbillid);
  273. }
  274. return batchDeleteErr.getReturnObject().toString();
  275. }
  276. @API(title = "审核", apiversion = R.ID20230719154103.v1.class)
  277. @CACHEING_CLEAN(apiClass = {stockbill.class, stockbillitems.class, Order.class, OrderItems.class,restcontroller.sale.stockbill.stockbill.class})
  278. public String check() throws YosException {
  279. Long st_stockbillid = content.getLong("st_stockbillid");
  280. ArrayList<String> sqlList = new ArrayList<>();
  281. Rows rows = dbConnect.runSqlQuery("select * from st_stockbill where st_stockbillid ='"
  282. + st_stockbillid + "' and siteid='" + siteid + "'");
  283. if (rows.isEmpty()) {
  284. return getErrReturnObject().setErrMsg("该出入库单不存在")
  285. .toString();
  286. }
  287. String type=rows.get(0).getString("type");
  288. boolean isinstock = isinstock(type,rows.get(0).getString("rb"),true);
  289. if(type.equals("销售出库")){
  290. String str = unxsckcheck(st_stockbillid);
  291. if(!str.equals("success")){
  292. return getErrReturnObject().setErrMsg(str)
  293. .toString();
  294. }
  295. }else if (type.equals("外购入库")) {
  296. } else if (type.equals("生产领料出库")) {
  297. } else if (type.equals("委外领料出库")) {
  298. } else if (type.equals("生产入库") || type.equals("委外入库")) {
  299. } else if (type.equals("其他入库")) {
  300. } else if (type.equals("返修入库")) {// 云链
  301. } else if (type.equals("返修出库")) {// 云链
  302. }
  303. updateIcinvbal(isinstock,0,st_stockbillid);// 即时库存计算
  304. SQLFactory sqlFactoryupdate = new SQLFactory(this, "出入库单审核");
  305. sqlFactoryupdate.addParameter("siteid", siteid);
  306. sqlFactoryupdate.addParameter("st_stockbillid", st_stockbillid);
  307. sqlFactoryupdate.addParameter("checkby", username);
  308. sqlList.add(sqlFactoryupdate.getSQL());
  309. sqlList.add(DataContrlLog.createLog(this, "st_stockbill", st_stockbillid, "审核", "出入库单审核成功").getSQL());
  310. dbConnect.runSqlUpdate(sqlList);
  311. return getSucReturnObject().toString();
  312. }
  313. @API(title = "反审核", apiversion = R.ID20230719154203.v1.class)
  314. @CACHEING_CLEAN(apiClass = {stockbill.class, stockbillitems.class, Order.class, OrderItems.class,stockbill.class,restcontroller.sale.stockbill.stockbill.class})
  315. public String uncheck() throws YosException {
  316. Long st_stockbillid = content.getLong("st_stockbillid");
  317. ArrayList<String> sqlList = new ArrayList<>();
  318. Rows rows = dbConnect.runSqlQuery("select type,rb from st_stockbill where st_stockbillid ='"
  319. + st_stockbillid + "' and siteid='" + siteid + "'");
  320. if (rows.isEmpty()) {
  321. return getErrReturnObject().setErrMsg("该出入库单不存在")
  322. .toString();
  323. }
  324. String type=rows.get(0).getString("type");
  325. boolean isinstock = isinstock(rows.get(0).getString("type"),rows.get(0).getString("rb"),false);
  326. if(type.equals("销售出库")){
  327. String str = unxsckcheck(st_stockbillid);
  328. if(!str.equals("success")){
  329. return getErrReturnObject().setErrMsg(str)
  330. .toString();
  331. }
  332. }else if (type.equals("外购入库")) {
  333. } else if (type.equals("生产领料出库")) {
  334. } else if (type.equals("委外领料出库")) {
  335. } else if (type.equals("生产入库") || type.equals("委外入库")) {
  336. } else if (type.equals("其他入库")) {
  337. } else if (type.equals("返修入库")) {// 云链
  338. } else if (type.equals("返修出库")) {// 云链
  339. }
  340. updateIcinvbal(isinstock,0,st_stockbillid);// 即时库存计算
  341. SQLFactory sqlFactoryupdate = new SQLFactory(this, "出入库单反审核");
  342. sqlFactoryupdate.addParameter("siteid", siteid);
  343. sqlFactoryupdate.addParameter("st_stockbillid", st_stockbillid);
  344. sqlFactoryupdate.addParameter("checkby", username);
  345. sqlList.add(sqlFactoryupdate.getSQL());
  346. sqlList.add(DataContrlLog.createLog(this, "st_stockbill", st_stockbillid, "反审核", "出入库单反审核成功").getSQL());
  347. dbConnect.runSqlUpdate(sqlList);
  348. return getSucReturnObject().toString();
  349. }
  350. public String xsckcheck(Long st_stockbillid) throws YosException {
  351. Rows rows = dbConnect.runSqlQuery("select * from st_stockbill where st_stockbillid ='"
  352. + st_stockbillid + "' and siteid='" + siteid + "'");
  353. Rows rowsdetail = dbConnect.runSqlQuery("select t1.*,t2.skucontrol from st_stockbill_items t1 left join plm_item t2 on t1.itemid=t2.itemid and t1.siteid=t2.siteid where t1.st_stockbillid ='"
  354. + st_stockbillid + "' and t1.siteid='" + siteid + "'");
  355. long sys_enterpriseid = rows.get(0).getLong("sys_enterpriseid");
  356. if (rows.isEmpty()) {
  357. return "该出入库单不存在";
  358. } else {
  359. if (!rows.get(0).getString("status").equals("新建")) {
  360. return "单号为:【" + rows.get(0).getString("billno") + "】的出入库单为非新建状态,无法审核";
  361. }
  362. }
  363. for(Row row : rowsdetail){
  364. if (row.getBigDecimal("qty").compareTo(BigDecimal.ZERO)<1) {
  365. return "表体数量不能小于0";
  366. }
  367. }
  368. if (rows.get(0).getBigDecimal("payamount").compareTo(BigDecimal.ZERO)<=0) {
  369. return "扣款金额需大于0";
  370. }
  371. if (StringUtils.isBlank(rows.get(0).getString("outplace"))) {
  372. return "发货地不可为空";
  373. }
  374. if ((rows.get(0).getBigDecimal("payamount").add(rows.get(0).getBigDecimal("paydiscountamount"))).compareTo(rowsdetail.sum("amount"))!=0) {
  375. return "扣款金额与应扣金额不符,不能审核";
  376. }
  377. Rows accountbalancerows = dbConnect.runSqlQuery("select * from sa_accountbalance t1 inner join sa_accountclass t2 on t1.sa_accountclassid=t2.sa_accountclassid and t1.siteid=t2.siteid where t2.accountname='现金账户' and t1.sys_enterpriseid="+sys_enterpriseid);
  378. if (accountbalancerows.isNotEmpty()) {
  379. BigDecimal discountamount = accountbalancerows.get(0).getBigDecimal("discountamount");
  380. if (rows.get(0).getBigDecimal("paydiscountamount").compareTo(discountamount)>0) {
  381. return "优惠金额不能大于可用优惠金额";
  382. }
  383. }else{
  384. return "账户不存在";
  385. }
  386. ArrayList<String> sqlList = new ArrayList<>();
  387. // Rows stockRows= dbConnect.runSqlQuery("select * from st_stock where siteid='"+siteid+"'");
  388. // RowsMap stockRowsMap =stockRows.toRowsMap("itemid");
  389. String order_paymentnode = Parameter.getString(siteid, "order_paymentnode");
  390. if(rows.get(0).getBoolean("rb")){
  391. if(rows.get(0).getString("type").equals("销售出库")){
  392. if (order_paymentnode.equals("3")) {
  393. if (Accountbalance.judgeBalance(this, sys_enterpriseid, accountbalancerows.get(0).getLong("sa_accountclassid"),rowsdetail.sum("amount"))) {
  394. CashbillEntity entity = getCashbillEntity(rows.get(0).getBigDecimal("payamount"),rows.get(0).getBigDecimal("paydiscountamount"), st_stockbillid, "销售出库单审核", rows.get(0).getString("billno"), "由销售出库单" + rows.get(0).getString("billno") + "审核时生成");
  395. JSONObject createCashbillPay = Accountbalance.createCashbillPay(this, sys_enterpriseid,accountbalancerows.get(0).getLong("sa_accountclassid"), entity, true);
  396. sqlList.addAll(createCashbillPay.getJSONArray("sqlList").toJavaList(String.class));
  397. } else {
  398. return "账户余额不足,还差" + Accountbalance.InsufficientBalance(this, sys_enterpriseid, accountbalancerows.get(0).getLong("sa_accountclassid"),rowsdetail.sum("amount")) + "元!";
  399. }
  400. }
  401. 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 st_stockbill_items where st_stockbillid=" + st_stockbillid + ")");
  402. RowsMap rowsMap = rowsOrderDetail.toRowsMap("sa_orderitemsid");
  403. Rows rowsDispatchDetailGroup = dbConnect.runSqlQuery("select sum(t1.qty) qty,t1.sa_orderitemsid,t1.siteid from st_stockbill_items t1 where t1.st_stockbillid=" + st_stockbillid + " group by t1.sa_orderitemsid,t1.siteid");
  404. Rows rowsjudge =dbConnect.runSqlQuery("select * from (select sa_orderitemsid,sum(qty) qty from st_stockbill_items where st_stockbillid ='"+st_stockbillid+"' group by sa_orderitemsid) t1 inner join sa_orderitems t2 on t1.sa_orderitemsid=t2.sa_orderitemsid where t1.qty>t2.undeliqty");
  405. if(rowsjudge.isNotEmpty()){
  406. return "存在商品已完全出库,无法审核";
  407. }
  408. for (Row row : rowsDispatchDetailGroup) {
  409. 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"));
  410. }
  411. for(Row row :rowsdetail){
  412. if(row.getBoolean("skucontrol")){
  413. sqlList.add("update st_stockbill_items set wmsuploadflag2=1 where st_stockbill_itemsid="+row.getLong("st_stockbill_itemsid"));
  414. }
  415. }
  416. }
  417. // for(Row row :rowsdetail){
  418. // String itemid= row.getString("itemid");
  419. // long stockid=row.getLong("stockid");
  420. // if(stockRowsMap.containsKey(itemid)){
  421. // for(Row row1 :stockRowsMap.get(itemid)){
  422. // if(row1.getLong("stockid")==stockid){
  423. // sqlList.add("update st_stock set qty="+row1.getBigDecimal("qty").add(row.getBigDecimal("qty"))+" where stockid="+stockid);
  424. // }
  425. // }
  426. // }
  427. // // String batchno = row.getString("batchno");
  428. // }
  429. }else{
  430. // for(Row row :rowsdetail){
  431. // String itemid= row.getString("itemid");
  432. // long stockid=row.getLong("stockid");
  433. // if(stockRowsMap.containsKey(itemid)){
  434. // for(Row row1 :stockRowsMap.get(itemid)){
  435. // if(row1.getLong("stockid")==stockid){
  436. // sqlList.add("update st_stock set qty="+row1.getBigDecimal("qty").subtract(row.getBigDecimal("qty"))+" where stockid="+stockid);
  437. // }
  438. // }
  439. // }
  440. // // String batchno = row.getString("batchno");
  441. // }
  442. }
  443. // Rows stockbillitems = dbConnect.runSqlQuery("select t2.sa_orderid,sum(t2.price*t1.qty) amount from st_stockbill_items t1 inner join sa_orderitems t2 on t1.siteid=t2.siteid and t1.sa_orderitemsid=t2.sa_orderitemsid where t1.siteid='"+siteid+"'and t1.st_stockbillid="+st_stockbillid+" group by t2.sa_orderid");
  444. // Rows orderRows =dbConnect.runSqlQuery("select * from sa_order where sa_orderid in(select t2.sa_orderid from st_stockbill_items t1 inner join sa_orderitems t2 on t1.siteid=t2.siteid and t1.sa_orderitemsid=t2.sa_orderitemsid where t1.st_stockbillid='"+st_stockbillid+"')");
  445. // RowsMap orderRowsMap =orderRows.toRowsMap("sa_orderid");
  446. dbConnect.runSqlUpdate(sqlList);
  447. // Accountbalance.remindSend(this, sys_enterpriseid, sa_cashbillid);
  448. return "success";
  449. }
  450. public String unxsckcheck(Long st_stockbillid) throws YosException {
  451. Rows rows = dbConnect.runSqlQuery("select * from st_stockbill where st_stockbillid ='"
  452. + st_stockbillid + "' and siteid='" + siteid + "'");
  453. Rows rowsdetail = dbConnect.runSqlQuery("select t1.*,t2.skucontrol from st_stockbill_items t1 left join plm_item t2 on t1.itemid=t2.itemid and t1.siteid=t2.siteid where t1.st_stockbillid ='"
  454. + st_stockbillid + "' and t1.siteid='" + siteid + "'");
  455. long sys_enterpriseid = rows.get(0).getLong("sys_enterpriseid");
  456. if (rows.isEmpty()) {
  457. return "该出入库单不存在";
  458. } else {
  459. if (!rows.get(0).getString("status").equals("审核")) {
  460. return "单号为:【" + rows.get(0).getString("billno") + "】的出入库单为非审核状态,无法反审核";
  461. }
  462. }
  463. for(Row row : rowsdetail){
  464. if (row.getBigDecimal("qty").compareTo(BigDecimal.ZERO)<1) {
  465. return "表体数量不能小于0";
  466. }
  467. }
  468. if (rows.get(0).getBigDecimal("paydiscountamount").compareTo(BigDecimal.ZERO)<0) {
  469. return "优惠金额不能小于0";
  470. }
  471. if (rows.get(0).getBigDecimal("payamount").compareTo(BigDecimal.ZERO)<=0) {
  472. return "扣款金额需大于0";
  473. }
  474. if (StringUtils.isBlank(rows.get(0).getString("outplace"))) {
  475. return "发货地不可为空";
  476. }
  477. if ((rows.get(0).getBigDecimal("payamount").add(rows.get(0).getBigDecimal("paydiscountamount"))).compareTo(rowsdetail.sum("amount"))!=0) {
  478. return "扣款金额与应扣金额不符,不能反审核";
  479. }
  480. Rows accountbalancerows = dbConnect.runSqlQuery("select * from sa_accountbalance t1 inner join sa_accountclass t2 on t1.sa_accountclassid=t2.sa_accountclassid and t1.siteid=t2.siteid where t2.accountname='现金账户' and t1.sys_enterpriseid="+sys_enterpriseid);
  481. if (accountbalancerows.isEmpty()) {
  482. return "账户不存在";
  483. }
  484. if (rows.get(0).getString("type").equals("销售出库") && rows.get(0).getBoolean("isreceiver")) {
  485. return "经销商已经确认收货,不可进行反审核";
  486. }
  487. ArrayList<String> sqlList = new ArrayList<>();
  488. // Rows stockRows= dbConnect.runSqlQuery("select * from st_stock where siteid='"+siteid+"'");
  489. // RowsMap stockRowsMap =stockRows.toRowsMap("itemid");
  490. String order_paymentnode = Parameter.getString(siteid, "order_paymentnode");
  491. if(rows.get(0).getBoolean("rb")){
  492. if(rows.get(0).getString("type").equals("销售出库")){
  493. if (order_paymentnode.equals("3")) {
  494. if (Accountbalance.judgeBalance(this, sys_enterpriseid, accountbalancerows.get(0).getLong("sa_accountclassid"),rowsdetail.sum("amount").negate())) {
  495. CashbillEntity entity = getCashbillEntity(rows.get(0).getBigDecimal("payamount").negate(),rows.get(0).getBigDecimal("paydiscountamount").negate(), st_stockbillid, "销售出库单反审核", rows.get(0).getString("billno"), "由销售出库单" + rows.get(0).getString("billno") + "反审核时生成");
  496. JSONObject createCashbillPay = Accountbalance.createCashbillPay(this, sys_enterpriseid,accountbalancerows.get(0).getLong("sa_accountclassid"), entity, true);
  497. sqlList.addAll(createCashbillPay.getJSONArray("sqlList").toJavaList(String.class));
  498. } else {
  499. return "账户余额不足,还差" + Accountbalance.InsufficientBalance(this, sys_enterpriseid, accountbalancerows.get(0).getLong("sa_accountclassid"),rowsdetail.sum("amount")) + "元!";
  500. }
  501. }
  502. 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 st_stockbill_items where st_stockbillid=" + st_stockbillid + ")");
  503. RowsMap rowsMap = rowsOrderDetail.toRowsMap("sa_orderitemsid");
  504. Rows rowsDispatchDetailGroup = dbConnect.runSqlQuery("select sum(t1.qty) qty,t1.sa_orderitemsid,t1.siteid from st_stockbill_items t1 where t1.st_stockbillid=" + st_stockbillid + " group by t1.sa_orderitemsid,t1.siteid");
  505. for (Row row : rowsDispatchDetailGroup) {
  506. 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"));
  507. }
  508. for(Row row :rowsdetail){
  509. if(row.getBoolean("skucontrol")){
  510. sqlList.add("update st_stockbill_items set wmsuploadflag2=0 where st_stockbill_itemsid="+row.getLong("st_stockbill_itemsid"));
  511. }
  512. }
  513. }
  514. // for(Row row :rowsdetail){
  515. // String itemid= row.getString("itemid");
  516. // long stockid=row.getLong("stockid");
  517. // if(stockRowsMap.containsKey(itemid)){
  518. // for(Row row1 :stockRowsMap.get(itemid)){
  519. // if(row1.getLong("stockid")==stockid){
  520. // sqlList.add("update st_stock set qty="+row1.getBigDecimal("qty").subtract(row.getBigDecimal("qty"))+" where stockid="+stockid);
  521. // }
  522. // }
  523. // }
  524. // // String batchno = row.getString("batchno");
  525. // }
  526. }else{
  527. // for(Row row :rowsdetail){
  528. // String itemid= row.getString("itemid");
  529. // long stockid=row.getLong("stockid");
  530. // if(stockRowsMap.containsKey(itemid)){
  531. // for(Row row1 :stockRowsMap.get(itemid)){
  532. // if(row1.getLong("stockid")==stockid){
  533. // sqlList.add("update st_stock set qty="+row1.getBigDecimal("qty").add(row.getBigDecimal("qty"))+" where stockid="+stockid);
  534. // }
  535. // }
  536. // }
  537. // // String batchno = row.getString("batchno");
  538. // }
  539. }
  540. // Rows stockbillitems = dbConnect.runSqlQuery("select t2.sa_orderid,sum(t2.price*t1.qty) amount from st_stockbill_items t1 inner join sa_orderitems t2 on t1.siteid=t2.siteid and t1.sa_orderitemsid=t2.sa_orderitemsid where t1.siteid='"+siteid+"'and t1.st_stockbillid="+st_stockbillid+" group by t2.sa_orderid");
  541. // Rows orderRows =dbConnect.runSqlQuery("select * from sa_order where sa_orderid in(select t2.sa_orderid from st_stockbill_items t1 inner join sa_orderitems t2 on t1.siteid=t2.siteid and t1.sa_orderitemsid=t2.sa_orderitemsid where t1.st_stockbillid='"+st_stockbillid+"')");
  542. // RowsMap orderRowsMap =orderRows.toRowsMap("sa_orderid");
  543. dbConnect.runSqlUpdate(sqlList);
  544. // Accountbalance.remindSend(this, sys_enterpriseid, sa_cashbillid);
  545. return "success";
  546. }
  547. @API(title = "仓库确认", apiversion = R.ID2025050709505703.v1.class)
  548. public String confirm() throws YosException {
  549. Long st_stockbillid = content.getLong("st_stockbillid");
  550. boolean isconfirm = content.getBooleanValue("isconfirm");
  551. Rows rows = dbConnect.runSqlQuery("select * from st_stockbill where st_stockbillid ='"
  552. + st_stockbillid + "' and siteid='" + siteid + "'");
  553. if (rows.isEmpty()) {
  554. return getErrReturnObject().setErrMsg("该出入库单不存在")
  555. .toString();
  556. } else {
  557. if (!rows.get(0).getString("status").equals("审核")) {
  558. return getErrReturnObject().setErrMsg("单号为:【" + rows.get(0).getString("billno") + "】的出入库单为非审核状态,无法进行仓库确认")
  559. .toString();
  560. }
  561. }
  562. UpdateSQL updateSQL = SQLFactory.createUpdateSQL(this, "st_stockbill");
  563. updateSQL.setUniqueid(st_stockbillid);
  564. updateSQL.setSiteid(siteid);
  565. updateSQL.setValue("isconfirm", isconfirm);
  566. updateSQL.setValue("changeby", username);
  567. updateSQL.setDateValue("changedate");
  568. dbConnect.runSqlUpdate(updateSQL.getSQL());
  569. return getSucReturnObject().toString();
  570. }
  571. @API(title = "更新站点信息详情详情", apiversion = R.ID20230720143503.v1.class)
  572. public String updateParameterSiteInfo() throws YosException {
  573. BigDecimal icstockbillrebaterate = content.getBigDecimal("icstockbillrebaterate");
  574. Long icstockbillrebateaccount = content.getLong("icstockbillrebateaccount");
  575. dbConnect.runSqlUpdate("update sys_site_parameter set icstockbillrebaterate='" + icstockbillrebaterate + "',icstockbillrebateaccount='" + icstockbillrebateaccount + "' where siteid='" + siteid + "'");
  576. return getSucReturnObject().toString();
  577. }
  578. @API(title = "站点信息详情", apiversion = R.ID20230720143603.v1.class)
  579. public String queryParameterSiteInfo() throws YosException {
  580. Rows rows = dbConnect.runSqlQuery("select icstockbillrebateaccount,icstockbillrebaterate from sys_site_parameter where siteid='" + siteid + "'");
  581. Row row = rows.isNotEmpty() ? rows.get(0) : new Row();
  582. return getSucReturnObject().setData(row).toString();
  583. }
  584. public CashbillEntity getCashbillEntity(BigDecimal amount,BigDecimal discountamount, Long ownerid, String source, String sourcenotes, String remarks) throws YosException {
  585. CashbillEntity entity = new CashbillEntity();
  586. entity.setAmount(amount);
  587. entity.setDiscountamountamount(discountamount);
  588. entity.setOwnerid(ownerid);
  589. entity.setOwnertable("st_stockbill");
  590. entity.setSource(source);
  591. entity.setRemarks(remarks);
  592. entity.setSourcenote(sourcenotes);
  593. return entity;
  594. }
  595. /**
  596. *
  597. * @param type
  598. * @param rb
  599. * @param fischeck
  600. * @return
  601. */
  602. public boolean isinstock(String type,String rb,boolean fischeck){
  603. if (type.equals("其他出库") || type.equals("销售出库")
  604. || type.equals("生产领料出库") || type.equals("委外领料出库")
  605. || type.equals("返修出库")) {
  606. if ((fischeck && rb.equals("1")) || (!fischeck && rb.equals("0"))) {
  607. return false;
  608. } else {
  609. return true;
  610. }
  611. } else if (type.equals("其他入库") || type.equals("外购入库")
  612. || type.equals("生产入库") || type.equals("委外入库")
  613. || type.equals("返修入库")) {
  614. if ((fischeck && rb.equals("1")) || (!fischeck && rb.equals("0"))) {
  615. return true;
  616. } else {
  617. return false;
  618. }
  619. }
  620. return false;
  621. }
  622. /**
  623. * @param isinstock 是否增加库存
  624. * @param type 库存更新类型 0为默认形式。1表示生产领料更新现场仓 2表示委外领料更新现场仓
  625. * @throws YosException
  626. */
  627. public void updateIcinvbal(boolean isinstock, int type,Long st_stockbillid) throws YosException {
  628. ArrayList<String> sqlList =new ArrayList();
  629. Rows icstockbilldetail =dbConnect.runSqlQuery("select t1.*,t2.skucontrol from st_stockbill_items t1 left join plm_item t2 on t1.itemid=t2.itemid and t1.siteid=t2.siteid where t1.st_stockbillid ='"
  630. + st_stockbillid + "' and t1.siteid='" + siteid + "'");// 出入库表体
  631. ArrayList<Long> itemids = new ArrayList<Long>();
  632. itemids = icstockbilldetail.toArrayList("itemid",new ArrayList<>());
  633. itemids.add((long) 0);
  634. int i = 0;
  635. String sql="select * from st_invbal where itemid in"+itemids;
  636. sql = sql.replace("[", "(").replace("]", ")");
  637. Rows invbals = dbConnect.runSqlQuery(sql);
  638. RowsMap invbalsRowsMap=invbals.toRowsMap("itemid");
  639. for(Row row : icstockbilldetail){
  640. String itemid = row.getString("itemid");
  641. //String batchno = row.getString("batchno");
  642. //String fdcspno = row.getString("fdcspno");
  643. String stockid = row.getString("stockid");
  644. // if (type == 1 && !getSysVars().getBoolean("FISBATCHFORXC")) {
  645. // fdcspno = "**********";
  646. // fbatchno = "**********";
  647. // fstockno = getPaoSet("TDEPARTMENT").getPao(0)
  648. // .getPaoSet("TSTOCKXC").getPao(0).getString("fstockno");
  649. // icinvbal = detailpao.getPaoSet("$icinvbal", "icinvbal",
  650. // "fitemno='" + fitemno + "' and fstockno='" + fstockno
  651. // + "' and fdcspno='" + fdcspno
  652. // + "' and fbatchno='" + fbatchno + "'");
  653. // } else if (type == 2 && !getSysVars().getBoolean("FISBATCHFORXC")) {
  654. // fdcspno = "**********";
  655. // fbatchno = "**********";
  656. // fstockno = getPaoSet("TSUPPLIER").getPao(0)
  657. // .getPaoSet("TSTOCKXC").getPao(0).getString("fstockno");
  658. // icinvbal = detailpao.getPaoSet("$icinvbal", "icinvbal",
  659. // "fitemno='" + fitemno + "' and fstockno='" + fstockno
  660. // + "' and fdcspno='" + fdcspno
  661. // + "' and fbatchno='" + fbatchno + "'");
  662. // }
  663. BigDecimal qty = isinstock ? row.getBigDecimal("qty") : row.getBigDecimal("qty").negate();
  664. if(!invbalsRowsMap.containsKey(itemid)){
  665. SQLFactory sqlFactory = new SQLFactory(this, "即时库存新增");
  666. sqlFactory.addParameter("st_invbalid", createTableID("st_invbal"));
  667. sqlFactory.addParameter("qty", qty);
  668. sqlFactory.addParameter("itemid", itemid);
  669. sqlFactory.addParameter("stockid", stockid);
  670. sqlFactory.addParameter("siteid",siteid);
  671. sqlFactory.addParameter("userid", userid);
  672. sqlFactory.addParameter("username", username);
  673. sqlList.add(sqlFactory.getSQL());
  674. }else{
  675. if(invbalsRowsMap.get(itemid).toRowsMap("stockid").containsKey(stockid)){
  676. SQLFactory sqlFactory = new SQLFactory(this, "即时库存更新");
  677. sqlFactory.addParameter("st_invbalid", createTableID("st_invbal"));
  678. sqlFactory.addParameter("qty", invbalsRowsMap.get(itemid).toRowsMap("stockid").get(stockid).get(0).getBigDecimal("qty").add(qty));
  679. sqlFactory.addParameter("itemid", itemid);
  680. sqlFactory.addParameter("stockid", stockid);
  681. sqlFactory.addParameter("siteid",siteid);
  682. sqlFactory.addParameter("userid", userid);
  683. sqlFactory.addParameter("username", username);
  684. sqlList.add(sqlFactory.getSQL());
  685. }else{
  686. SQLFactory sqlFactory = new SQLFactory(new Invbal(), "即时库存新增");
  687. sqlFactory.addParameter("st_invbalid", createTableID("st_invbal"));
  688. sqlFactory.addParameter("qty", qty);
  689. sqlFactory.addParameter("itemid", itemid);
  690. sqlFactory.addParameter("stockid", stockid);
  691. sqlFactory.addParameter("siteid",siteid);
  692. sqlFactory.addParameter("userid", userid);
  693. sqlFactory.addParameter("username", username);
  694. sqlList.add(sqlFactory.getSQL());
  695. }
  696. }
  697. }
  698. dbConnect.runSqlUpdate(sqlList);
  699. }
  700. }