stockbill.java 107 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851
  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.itemprice.ItemPrice;
  7. import beans.parameter.Parameter;
  8. import beans.report.Report;
  9. import beans.stockbill.Stockbill;
  10. import com.alibaba.fastjson2.JSONArray;
  11. import com.alibaba.fastjson2.JSONObject;
  12. import common.Controller;
  13. import common.YosException;
  14. import common.annotation.API;
  15. import common.annotation.CACHEING;
  16. import common.annotation.CACHEING_CLEAN;
  17. import common.data.*;
  18. import org.apache.commons.lang.StringUtils;
  19. import org.apache.poi.ss.usermodel.CellStyle;
  20. import org.apache.poi.ss.usermodel.DataFormat;
  21. import org.apache.poi.xssf.usermodel.*;
  22. import restcontroller.R;
  23. import restcontroller.webmanage.sale.order.Order;
  24. import restcontroller.webmanage.sale.order.OrderItems;
  25. import restcontroller.webmanage.sale.sendrepair.sendrepair;
  26. import restcontroller.webmanage.sale.sendrepair.sendrepair_pj;
  27. import java.math.BigDecimal;
  28. import java.text.SimpleDateFormat;
  29. import java.util.ArrayList;
  30. import java.util.Date;
  31. import java.util.HashMap;
  32. /**
  33. * 出入库单
  34. */
  35. @API(title = "出入库单")
  36. public class stockbill extends Controller {
  37. /**
  38. * 构造函数
  39. *
  40. * @param content
  41. */
  42. public stockbill(JSONObject content) throws YosException {
  43. super(content);
  44. }
  45. @API(title = "新增销售出库单", apiversion = R.ID2025043010105603.v1.class)
  46. @CACHEING_CLEAN(apiClass = {stockbill.class, stockbillitems.class})
  47. public String insertormodify_stockbill() throws YosException {
  48. ArrayList<String> sqlList = new ArrayList<>();
  49. // 表名
  50. String tableName = "st_stockbill";
  51. Long st_stockbillid = content.getLong("st_stockbillid");
  52. Long sys_enterpriseid = content.getLong("sys_enterpriseid");
  53. Rows contactrows = dbConnect.runSqlQuery("select * from sys_enterprise_contacts where sys_enterpriseid=" + sys_enterpriseid + " and ifnull(deleted,0)=0");
  54. Long rec_contactsid = content.getLongValue("rec_contactsid");
  55. if (contactrows.isNotEmpty()) {
  56. rec_contactsid = contactrows.get(0).getLong("contactsid");
  57. }
  58. Long departmentid = content.getLongValue("departmentid");
  59. String type = content.getStringValue("type");
  60. long stockid = content.getLongValue("stockid");
  61. String typemx = content.getStringValue("typemx");
  62. String remarks = content.getStringValue("remarks");
  63. String billdate = content.getStringValue("billdate");
  64. String outplace = content.getStringValue("outplace");
  65. String delivery = content.getStringValue("delivery");
  66. String logisticsmethod = content.getStringValue("logisticsmethod");
  67. Rows invoicerows = dbConnect.runSqlQuery("select * from sys_enterprise_finance where sys_enterpriseid=" + sys_enterpriseid + " order by isdefault desc");
  68. String invoice_enterprisename = content.getStringValue("invoice_enterprisename");
  69. String invoice_address = content.getStringValue("invoice_address");
  70. String invoice_taxno = content.getStringValue("invoice_taxno");
  71. if (invoicerows.isNotEmpty()) {
  72. invoice_enterprisename = invoicerows.get(0).getString("enterprisename");
  73. invoice_address = invoicerows.get(0).getString("address");
  74. invoice_taxno = invoicerows.get(0).getString("taxno");
  75. }
  76. String tracknumber = content.getStringValue("tracknumber");
  77. boolean isconfirm = content.getBooleanValue("isconfirm");
  78. if (st_stockbillid <= 0) {
  79. st_stockbillid = createTableID(tableName);
  80. InsertSQL insertSQL = SQLFactory.createInsertSQL(this, tableName);
  81. insertSQL.setUniqueid(st_stockbillid);
  82. insertSQL.setSiteid(siteid);
  83. insertSQL.setValue("sys_enterpriseid", sys_enterpriseid);
  84. insertSQL.setValue("rec_contactsid", rec_contactsid);
  85. insertSQL.setValue("departmentid", departmentid);
  86. insertSQL.setValue("stockid", stockid);
  87. insertSQL.setValue("type", type);
  88. insertSQL.setValue("typemx", typemx);
  89. insertSQL.setValue("sa_supplierid", content.getLongValue("sa_supplierid"));
  90. insertSQL.setValue("rb", content.getString("rb"));
  91. insertSQL.setValue("remarks", remarks);
  92. if (StringUtils.isBlank(billdate)) {
  93. insertSQL.setDateValue("billdate");
  94. insertSQL.setValue("period",getPeriod(false,new Date()));
  95. } else {
  96. insertSQL.setValue("billdate", billdate);
  97. insertSQL.setValue("period",getPeriod(false,content.getDate("billdate")));
  98. }
  99. if (type.equals("销售出库")) {
  100. insertSQL.setValue("billno", createBillCode("stockbill"));
  101. } else if (type.equals("其他出库单")) {
  102. insertSQL.setValue("billno", createBillCode("STOCKBILL1"));
  103. } else if (type.equals("其他入库单")) {
  104. insertSQL.setValue("billno", createBillCode("STOCKBILL2"));
  105. } else {
  106. insertSQL.setValue("billno", createBillCode("stockbill"));
  107. }
  108. insertSQL.setValue("outplace", outplace);
  109. insertSQL.setValue("delivery", delivery);
  110. insertSQL.setValue("logisticsmethod", logisticsmethod);
  111. insertSQL.setValue("invoice_enterprisename", invoice_enterprisename);
  112. insertSQL.setValue("invoice_address", invoice_address);
  113. insertSQL.setValue("invoice_taxno", invoice_taxno);
  114. insertSQL.setValue("tracknumber", tracknumber);
  115. insertSQL.setValue("isconfirm", isconfirm);
  116. insertSQL.setValue("createby", username);
  117. insertSQL.setDateValue("createdate");
  118. insertSQL.setValue("changeby", username);
  119. insertSQL.setDateValue("changedate");
  120. insertSQL.setValue("status", "新建");
  121. insertSQL.setValue("payamount", 0);
  122. insertSQL.setValue("paydiscountamount", 0);
  123. sqlList.add(insertSQL.getSQL());
  124. sqlList.add(DataContrlLog.createLog(this, "st_stockbill", st_stockbillid, "新增", "销售出库单新增成功").getSQL());
  125. } else {
  126. Rows rows = dbConnect.runSqlQuery(
  127. "SELECT status,sys_enterpriseid,paydiscountamount,payamount,sourceobject from st_stockbill WHERE st_stockbillid = "
  128. + st_stockbillid);
  129. if (rows.isNotEmpty()) {
  130. if (rows.get(0).getString("status").equals("新建")) {
  131. if(rows.get(0).getString("sourceobject").equals("tpartreimbursement")){
  132. return getErrReturnObject().setErrMsg("由核销生成的出入库单无法编辑").toString();
  133. }
  134. UpdateSQL updateSQL = SQLFactory.createUpdateSQL(this, tableName);
  135. updateSQL.setUniqueid(st_stockbillid);
  136. updateSQL.setSiteid(siteid);
  137. updateSQL.setValue("sys_enterpriseid", sys_enterpriseid);
  138. updateSQL.setValue("rec_contactsid", rec_contactsid);
  139. updateSQL.setValue("departmentid", departmentid);
  140. updateSQL.setValue("stockid", stockid);
  141. updateSQL.setValue("remarks", remarks);
  142. updateSQL.setValue("rb", content.getString("rb"));
  143. updateSQL.setValue("typemx", typemx);
  144. updateSQL.setValue("billdate", billdate);
  145. updateSQL.setValue("outplace", outplace);
  146. updateSQL.setValue("delivery", delivery);
  147. updateSQL.setValue("logisticsmethod", logisticsmethod);
  148. updateSQL.setValue("invoice_enterprisename", content.getStringValue("invoice_enterprisename"));
  149. updateSQL.setValue("invoice_address", content.getStringValue("invoice_address"));
  150. updateSQL.setValue("invoice_taxno", content.getStringValue("invoice_taxno"));
  151. updateSQL.setValue("tracknumber", tracknumber);
  152. updateSQL.setValue("isconfirm", isconfirm);
  153. if(type.equals("销售出库")){
  154. updateSQL.setValue("payamount", content.getBigDecimal("payamount"));
  155. updateSQL.setValue("paydiscountamount", content.getBigDecimal("paydiscountamount"));
  156. if(content.getBigDecimal("payamount").compareTo(rows.get(0).getBigDecimal("payamount"))!=0
  157. || content.getBigDecimal("paydiscountamount").compareTo(rows.get(0).getBigDecimal("paydiscountamount"))!=0){
  158. sqlList.add(DataContrlLog.createLog(this, "st_stockbill", st_stockbillid, "金额更新变更", "销售出库单更支付金额:"+content.getBigDecimal("payamount")+",优惠金额:"+content.getBigDecimal("paydiscountamount")).getSQL());
  159. }
  160. }
  161. updateSQL.setValue("period", content.getStringValue("period"));
  162. updateSQL.setValue("changeby", username);
  163. updateSQL.setDateValue("changedate");
  164. sqlList.add(updateSQL.getSQL());
  165. sqlList.add(DataContrlLog.createLog(this, "st_stockbill", st_stockbillid, "更新", "销售出库单更新成功").getSQL());
  166. } else {
  167. return getErrReturnObject().setErrMsg("非新建状态下无法编辑").toString();
  168. }
  169. } else {
  170. return getErrReturnObject().setErrMsg("该销售出库单不存在").toString();
  171. }
  172. }
  173. dbConnect.runSqlUpdate(sqlList);
  174. content.put("st_stockbillid", st_stockbillid);
  175. return queryStockbillMain();
  176. }
  177. @API(title = "单据日期调整", apiversion = R.ID2025102215133403.v1.class)
  178. public String billdateChange() throws YosException {
  179. JSONArray st_stockbillids = content.getJSONArray("st_stockbillids");
  180. Date billdate = content.getDate("billdate");
  181. String period = getPeriod(false,billdate);
  182. BatchDeleteErr batchDeleteErr = BatchDeleteErr.create(this, st_stockbillids.size());
  183. ArrayList<String> sqlList = new ArrayList<>();
  184. QuerySQL querySQL = SQLFactory.createQuerySQL(this, "st_stockbill", "*").setTableAlias("t1");
  185. querySQL.setSiteid(siteid);
  186. querySQL.setWhere("t1.st_stockbillid",st_stockbillids);
  187. Rows rows = querySQL.query();
  188. RowsMap rowsMap =rows.toRowsMap("st_stockbillid");
  189. RowsMap periodrowsMap =dbConnect.runSqlQuery("select CONCAT(year, '-',LPAD(month, 2, '0')) period,isclose from st_period").toRowsMap("isclose");
  190. if(periodrowsMap.get("1").toRowsMap("period").containsKey(period)){
  191. return getErrReturnObject().setErrMsg("原单据会计期间已关闭,不可调整").toString();
  192. }
  193. for (Object o : st_stockbillids) {
  194. long st_stockbillid = Long.parseLong(o.toString());
  195. if(rowsMap.containsKey(st_stockbillid)){
  196. if(rowsMap.get(st_stockbillid).get(0).getString("status").equals("审核")){
  197. if (periodrowsMap.get("1").toRowsMap("period").containsKey(period)) {
  198. batchDeleteErr.addErr(st_stockbillid, "原单据会计期间已关闭,不可调整");
  199. continue;
  200. }else if(!periodrowsMap.get("0").toRowsMap("period").containsKey(period)){
  201. batchDeleteErr.addErr(st_stockbillid, "原单据会计期间未生成,不可调整");
  202. continue;
  203. }
  204. }
  205. }else{
  206. batchDeleteErr.addErr(st_stockbillid, "该单据不存在");
  207. continue;
  208. }
  209. sqlList.add(DataContrlLog.createLog(this, "st_stockbill", st_stockbillid, "更新", "单据日期【"+content.getString("billdate")+"】调整成功").getSQL());
  210. sqlList.add("update st_stockbill set billdate='"+content.getString("billdate")+"',period='"+period+"' where st_stockbillid="+st_stockbillid);
  211. }
  212. dbConnect.runSqlUpdate(sqlList);
  213. return batchDeleteErr.getReturnObject().toString();
  214. }
  215. @API(title = "出入库单详情", apiversion = R.ID20230719153803.v1.class)
  216. @CACHEING
  217. public String queryStockbillMain() throws YosException {
  218. Long st_stockbillid = content.getLong("st_stockbillid");
  219. SQLFactory sqlFactory = new SQLFactory(this, "出入库单详情");
  220. sqlFactory.addParameter("st_stockbillid", st_stockbillid);
  221. sqlFactory.addParameter("siteid", siteid);
  222. Rows rows = dbConnect.runSqlQuery(sqlFactory);
  223. Row row = rows.isNotEmpty() ? rows.get(0) : new Row();
  224. Rows rowsdetail = dbConnect.runSqlQuery("select amount,qty from st_stockbill_items where st_stockbillid=" + st_stockbillid);
  225. row.put("receivableamount", rowsdetail.sum("amount"));
  226. 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=" + row.getLong("sys_enterpriseid"));
  227. Rows stockbillrows_hong = dbConnect.runSqlQuery("select billno from st_stockbill t1 where t1.rb=0 and t1.sourceobject='st_stockbill' and t1.sourceid=" + st_stockbillid);
  228. Rows expressformrows = dbConnect.runSqlQuery("select t1.* from expressform t1 inner join sa_expressform_stockbill t2 on t1.expressformid=t2.expressformid and t1.siteid=t2.siteid where t2.st_stockbillid ='"
  229. + st_stockbillid + "' and t1.siteid='" + siteid + "'");
  230. if(accountbalancerows.isNotEmpty()){
  231. row.put("discountamount_xjzh", accountbalancerows.get(0).getBigDecimal("discountamount"));
  232. }else{
  233. row.put("discountamount_xjzh", 0);
  234. }
  235. if(stockbillrows_hong.isNotEmpty()){
  236. row.put("billno_hong", stockbillrows_hong.get(0).getString("billno"));
  237. }else{
  238. row.put("billno_hong", "");
  239. }
  240. row.put("qty",rowsdetail.sum("qty"));
  241. row.put("expressform",expressformrows);
  242. return getSucReturnObject().setData(row).toString();
  243. }
  244. @API(title = "查询出入库单列表", apiversion = R.ID20230719153903.v1.class)
  245. @CACHEING
  246. public String queryStockbillList() throws YosException {
  247. ArrayList<String> billtypes = new ArrayList<>();
  248. StringBuffer where = new StringBuffer(" 1=1 ");
  249. if (content.containsKey("where")) {
  250. JSONObject whereObject = content.getJSONObject("where");
  251. if (whereObject.containsKey("type") && !"".equals(whereObject.getString("type"))) {
  252. JSONArray jsonArray = whereObject.getJSONArray("type");
  253. billtypes = (ArrayList<String>) jsonArray.toJavaList(String.class);
  254. }
  255. if (whereObject.containsKey("typemx") && !"".equals(whereObject.getString("typemx"))) {
  256. where.append(" and t1.typemx ='").append(whereObject.getString("typemx")).append("' ");
  257. }
  258. if (whereObject.containsKey("status") && !"".equals(whereObject.getString("status"))) {
  259. where.append(" and t1.status ='").append(whereObject.getString("status")).append("' ");
  260. }
  261. if (whereObject.containsKey("rb") && !"".equals(whereObject.getString("rb"))) {
  262. where.append(" and t1.rb ='").append(whereObject.getString("rb")).append("' ");
  263. }
  264. if (whereObject.containsKey("begindate") && !"".equals(whereObject.getString("begindate"))) {
  265. where.append(" and t1.billdate >='").append(whereObject.getString("begindate")).append("' ");
  266. }
  267. if (whereObject.containsKey("enddate") && !"".equals(whereObject.getString("enddate"))) {
  268. where.append(" and t1.billdate <='").append(whereObject.getString("enddate")).append("' ");
  269. }
  270. if (whereObject.containsKey("remarks") && !"".equals(whereObject.getString("remarks"))) {
  271. where.append(" and t1.remarks like'%").append(whereObject.getString("remarks")).append("%' ");
  272. }
  273. if (whereObject.containsKey("dateinterval") && !"".equals(whereObject.getString("dateinterval"))) {
  274. if (whereObject.getString("dateinterval").equals("past30days")) {
  275. where.append(" and t1.billdate >=DATE_SUB(CURDATE(), INTERVAL 30 DAY)");
  276. } else if (whereObject.getString("dateinterval").equals("past15days")) {
  277. where.append(" and t1.billdate >=DATE_SUB(CURDATE(), INTERVAL 15 DAY)");
  278. } else if (whereObject.getString("dateinterval").equals("today")) {
  279. where.append(" and t1.billdate >=CURDATE()");
  280. }
  281. }
  282. if (whereObject.containsKey("checknoprint") && !"".equals(whereObject.getString("checknoprint"))) {
  283. if (whereObject.getBooleanValue("checknoprint")) {
  284. where.append(" and t1.status ='审核' and isreport=0");
  285. }
  286. }
  287. if (whereObject.containsKey("nowaybillgenerated") && !"".equals(whereObject.getString("nowaybillgenerated"))) {
  288. if (whereObject.getBooleanValue("checknoprint")) {
  289. where.append(" and t1.isreceiver=0 and ifnull(txlogisticid,'')='' ");
  290. }
  291. }
  292. if (whereObject.containsKey("paynocheck") && !"".equals(whereObject.getString("paynocheck"))) {
  293. where.append(" and t1.status ='新建' and delivery='到付'");
  294. }
  295. if (whereObject.containsKey("jfnocheck") && !"".equals(whereObject.getString("jfnocheck"))) {
  296. where.append(" and t1.status ='新建' and delivery='寄付'");
  297. }
  298. }
  299. QuerySQL querySQL = SQLFactory.createQuerySQL(this, "st_stockbill", "*").setTableAlias("t1");
  300. if (billtypes.contains("销售出库") || billtypes.contains("返修入库") || billtypes.contains("返修出库")) {
  301. querySQL.addJoinTable(JOINTYPE.left, "sys_enterprise", "t2", "t1.sys_enterpriseid = t2.sys_enterpriseid AND t1.siteid = t2.siteid",
  302. "enterprisename", "abbreviation");
  303. querySQL.addJoinTable(JOINTYPE.left, "sa_agents", "t3", "t1.sys_enterpriseid = t3.sys_enterpriseid AND t1.siteid = t3.siteid",
  304. "agentnum");
  305. }
  306. if (billtypes.contains("销售出库")) {
  307. querySQL.addJoinTable(JOINTYPE.left, "sys_enterprise_contacts", "t4", "t1.rec_contactsid=t4.contactsid and t1.siteid = t4.siteid");
  308. 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='现金账户')",
  309. "discountamount");
  310. querySQL.addQueryFields("recname", "t4.name");
  311. querySQL.addQueryFields("recphonenumber", "t4.phonenumber");
  312. querySQL.addQueryFields("recaddress", "t4.address");
  313. }
  314. querySQL.addJoinTable(JOINTYPE.left, "sys_department", "t6", "t1.departmentid=t6.departmentid and t1.siteid = t6.siteid",
  315. "depno", "depname");
  316. if (billtypes.contains("其他入库")) {
  317. querySQL.addJoinTable(JOINTYPE.left, "sa_supplier", "t7", "t1.sa_supplierid=t7.sa_supplierid and t1.siteid = t7.siteid",
  318. "suppno", "suppname", "suppshortname");
  319. }
  320. querySQL.addJoinTable(JOINTYPE.left, "st_stock", "t8", "t1.stockid=t8.stockid and t1.siteid = t8.siteid",
  321. "stockname");
  322. if (billtypes.contains("其他入库") || billtypes.contains("其他出库")) {
  323. querySQL.addJoinTable(JOINTYPE.left, "st_dbstockbill", "t9", "t1.sourceid=t9.st_dbstockbillid and t1.siteid = t9.siteid and t1.sourceobject='st_dbstockbill'");
  324. querySQL.addQueryFields("dbbillno", "t9.billno");
  325. }
  326. if (billtypes.contains("返修出库")) {
  327. querySQL.addJoinTable(JOINTYPE.left, "sa_sendrepair", "t10", "t10.sourceid=t1.st_stockbillid and t10.siteid = t1.siteid and t10.sourcetable='st_stockbill'","instockdate");
  328. }
  329. querySQL.setWhere("t1.siteid", siteid);
  330. querySQL.setWhere("t1.type", billtypes);
  331. querySQL.setWhere(where);
  332. querySQL.setCondition("t1.billno", "t1.outplace", "t3.agentnum", " t2.enterprisename", "t6.depname");
  333. querySQL.setPage(pageSize, pageNumber);
  334. Rows rows = querySQL.query();
  335. ArrayList<Long> ids = rows.toArrayList("st_stockbillid", new ArrayList<>());
  336. HashMap<Long, Integer> reportMap =Report.getViewCount(this,"st_stockbill",ids);
  337. for(Row row :rows){
  338. if(reportMap.containsKey(row.getLong("st_stockbillid"))){
  339. row.put("printcount",reportMap.get(row.getLong("st_stockbillid")));
  340. }
  341. }
  342. if(billtypes.contains("返修出库")){
  343. QuerySQL querySQLDatail = SQLFactory.createQuerySQL(this, "st_stockbill_items","sku", "st_stockbillid").setTableAlias("t1");
  344. querySQLDatail.addJoinTable(JOINTYPE.left, "st_stockbill_items_sku", "t2", "t1.st_stockbill_itemsid=t2.st_stockbill_itemsid and t1.siteid = t2.siteid");
  345. querySQLDatail.addJoinTable(JOINTYPE.left, "plm_item", "t3", "t3.itemid=t1.itemid and t3.siteid = t1.siteid ","itemno","itemname","spec","model");
  346. querySQLDatail.setWhere("t1.st_stockbillid",ids);
  347. Rows rowsdatail = querySQLDatail.query();
  348. RowsMap rowsdatailMap = rowsdatail.toRowsMap("st_stockbillid");
  349. for(Row row :rows){
  350. if(rowsdatailMap.containsKey(row.getString("st_stockbillid"))){
  351. row.put("itemskus",rowsdatailMap.get(row.getString("st_stockbillid")));
  352. }
  353. }
  354. }
  355. return getSucReturnObject().setData(rows).toString();
  356. }
  357. @API(title = "删除", apiversion = R.ID20230719154003.v1.class)
  358. @CACHEING_CLEAN(apiClass = {stockbill.class, stockbillitems.class})
  359. public String delete() throws YosException {
  360. JSONArray st_stockbillids = content.getJSONArray("st_stockbillids");
  361. BatchDeleteErr batchDeleteErr = BatchDeleteErr.create(this, st_stockbillids.size());
  362. for (Object o : st_stockbillids) {
  363. long st_stockbillid = Long.parseLong(o.toString());
  364. Rows RowsStatus = dbConnect.runSqlQuery("select st_stockbillid,status from st_stockbill where siteid='"
  365. + siteid + "' and st_stockbillid='" + st_stockbillid + "'");
  366. if (RowsStatus.isNotEmpty()) {
  367. if (!RowsStatus.get(0).getString("status").equals("新建")) {
  368. batchDeleteErr.addErr(st_stockbillid, "非新建状态的出入库单无法删除");
  369. continue;
  370. }
  371. }
  372. dbConnect.runSqlUpdate(
  373. "delete from st_stockbill where siteid='" + siteid + "' and st_stockbillid=" + st_stockbillid);
  374. dbConnect.runSqlUpdate(
  375. "delete from st_stockbill_items where siteid='" + siteid + "' and st_stockbillid=" + st_stockbillid);
  376. dbConnect.runSqlUpdate(
  377. "delete from st_stockbill_items_sku where siteid='" + siteid + "' and st_stockbillid=" + st_stockbillid);
  378. }
  379. return batchDeleteErr.getReturnObject().toString();
  380. }
  381. @API(title = "审核", apiversion = R.ID20230719154103.v1.class)
  382. @CACHEING_CLEAN(apiClass = {stockbill.class, stockbillitems.class, Order.class, OrderItems.class, restcontroller.sale.stockbill.stockbill.class})
  383. public String check() throws YosException {
  384. JSONArray st_stockbillids = content.getJSONArray("st_stockbillids");
  385. for (Object o : st_stockbillids) {
  386. long st_stockbillid = Long.parseLong(o.toString());
  387. Stockbill.check(this, st_stockbillid, true);
  388. }
  389. return getSucReturnObject().toString();
  390. }
  391. @API(title = "反审核", apiversion = R.ID20230719154203.v1.class)
  392. @CACHEING_CLEAN(apiClass = {stockbill.class, stockbillitems.class, Order.class, OrderItems.class, stockbill.class, restcontroller.sale.stockbill.stockbill.class})
  393. public String uncheck() throws YosException {
  394. JSONArray st_stockbillids = content.getJSONArray("st_stockbillids");
  395. for (Object o : st_stockbillids) {
  396. long st_stockbillid = Long.parseLong(o.toString());
  397. Stockbill.check(this, st_stockbillid, false);
  398. }
  399. return getSucReturnObject().toString();
  400. }
  401. @API(title = "生成送修单", apiversion = R.ID2025070415073603.v1.class)
  402. @CACHEING_CLEAN(apiClass = {sendrepair.class, sendrepair_pj.class})
  403. public String sendrepair() throws YosException {
  404. JSONArray st_stockbillids = content.getJSONArray("st_stockbillids");
  405. QuerySQL querySQL = SQLFactory.createQuerySQL(this, "st_stockbill", "st_stockbillid", "status", "type", "typemx", "remarks", "sys_enterpriseid", "isrepair");
  406. querySQL.setTableAlias("t1");
  407. querySQL.setSiteid(siteid);
  408. querySQL.setWhere("t1.st_stockbillid", st_stockbillids.toJavaList(Long.class));
  409. Rows rows = querySQL.query();
  410. QuerySQL querySQLDetail = SQLFactory.createQuerySQL(this, "st_stockbill_items", "*");
  411. querySQLDetail.setTableAlias("t1");
  412. querySQLDetail.addJoinTable(JOINTYPE.left, "sa_aftersalesmag_items", "t2", "t1.sourceobject ='sa_aftersalesmag_items' and t1.sourceid=t2.sa_aftersalesmag_itemsid AND t1.siteid = t2.siteid", "name", "phonenumber", "address", "stockdate", "enddate", "remarks", "duty", "demand", "reason");
  413. querySQLDetail.addQueryFields("sku", "t2.machinecode");
  414. querySQLDetail.setSiteid(siteid);
  415. querySQLDetail.setWhere("t1.st_stockbillid", st_stockbillids.toJavaList(Long.class));
  416. RowsMap rowsMapDetail = querySQLDetail.query().toRowsMap("st_stockbillid");
  417. ArrayList<Long> sa_sendrepairids = new ArrayList<>();
  418. ArrayList<String> sqlList = new ArrayList<>();
  419. for (Row row : rows) {
  420. if (!row.getString("type").equals("返修入库")) {
  421. return getErrReturnObject().setErrMsg("非返修入库单无法生成送修单").toString();
  422. }
  423. if (row.getBoolean("isrepair")) {
  424. return getErrReturnObject().setErrMsg("已生成送修单,无法再次生成").toString();
  425. }
  426. if (!row.getString("type").equals("返修入库")) {
  427. return getErrReturnObject().setErrMsg("非返修入库单无法生成送修单").toString();
  428. }
  429. InsertSQL insertSQL = SQLFactory.createInsertSQL(this, "sa_sendrepair");
  430. long sa_sendrepairid = createTableID("sa_sendrepair");
  431. sa_sendrepairids.add(sa_sendrepairid);
  432. insertSQL.setUniqueid(sa_sendrepairid);
  433. insertSQL.setSiteid(siteid);
  434. insertSQL.setValue("billno", createBillCode("sendrepair"));
  435. insertSQL.setValue("remarks", row.getString("remarks"));
  436. insertSQL.setValue("sys_enterpriseid", row.getLong("sys_enterpriseid"));
  437. insertSQL.setValue("sourcetable", "st_stockbill");
  438. insertSQL.setValue("sourceid", row.getLong("st_stockbillid"));
  439. insertSQL.setValue("status", "新建");
  440. insertSQL.setValue("createby", username);
  441. insertSQL.setDateValue("createdate");
  442. insertSQL.setDateValue("billdate");
  443. sqlList.add(insertSQL.getSQL());
  444. sqlList.add(DataContrlLog.createLog(this, "st_stockbill", row.getLong("st_stockbillid"), "转送修单", "转送修单成功").getSQL());
  445. ArrayList<Long> ids = rowsMapDetail.get(row.getString("st_stockbillid")).toArrayList("itemid", new ArrayList<>());
  446. HashMap<Long, ItemPrice> itemPriceRowsMap = ItemPrice.getItemPrice(this, sys_enterpriseid, ids);
  447. for (Row rowdetail : rowsMapDetail.get(row.getString("st_stockbillid"))) {
  448. insertSQL = SQLFactory.createInsertSQL(this, "sa_sendrepair_detail");
  449. long sa_sendrepair_detailid = createTableID("sa_sendrepair_detail");
  450. insertSQL.setUniqueid(sa_sendrepair_detailid);
  451. insertSQL.setSiteid(siteid);
  452. insertSQL.setValue("sa_sendrepairid", sa_sendrepairid);
  453. insertSQL.setValue("name", rowdetail.getString("name"));
  454. insertSQL.setValue("phonenumber", rowdetail.getString("phonenumber"));
  455. insertSQL.setValue("address", rowdetail.getString("address"));
  456. insertSQL.setValue("stockdate", StringUtils.isBlank(rowdetail.getString("stockdate")) ? "null" : rowdetail.getString("stockdate"));
  457. insertSQL.setValue("enddate", StringUtils.isBlank(rowdetail.getString("enddate")) ? "null" : rowdetail.getString("enddate"));
  458. insertSQL.setValue("remarks", rowdetail.getString("remarks"));
  459. insertSQL.setValue("duty", rowdetail.getString("duty"));
  460. insertSQL.setValue("demand", rowdetail.getString("demand"));
  461. insertSQL.setValue("reason", rowdetail.getString("reason"));
  462. insertSQL.setValue("qty", rowdetail.getBigDecimal("qty"));
  463. insertSQL.setValue("sku", rowdetail.getString("sku"));
  464. insertSQL.setValue("itemid", rowdetail.getString("itemid"));
  465. if (itemPriceRowsMap.containsKey(rowdetail.getLong("itemid"))) {
  466. insertSQL.setValue("price", itemPriceRowsMap.get(rowdetail.getLong("itemid")).getPrice());
  467. } else {
  468. insertSQL.setValue("price", 0);
  469. }
  470. sqlList.add(insertSQL.getSQL());
  471. sqlList.add("update st_stockbill_items set isrepair=1 where st_stockbill_itemsid=" + rowdetail.getLong("st_stockbill_itemsid"));
  472. }
  473. sqlList.add("update st_stockbill set isrepair=1 where st_stockbillid=" + row.getLong("st_stockbillid"));
  474. }
  475. dbConnect.runSqlUpdate(sqlList);
  476. return getSucReturnObject().setData(sa_sendrepairids).toString();
  477. }
  478. // public String xsckcheck(Long st_stockbillid, boolean isinstock) throws YosException {
  479. // Rows rows = dbConnect.runSqlQuery("select * from st_stockbill where st_stockbillid ='"
  480. // + st_stockbillid + "' and siteid='" + siteid + "'");
  481. // 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 ='"
  482. // + st_stockbillid + "' and t1.siteid='" + siteid + "'");
  483. // long sys_enterpriseid = rows.get(0).getLong("sys_enterpriseid");
  484. //
  485. // if (rows.isEmpty()) {
  486. // return "该出入库单不存在";
  487. // } else {
  488. // if (!rows.get(0).getString("status").equals("新建")) {
  489. // return "单号为:【" + rows.get(0).getString("billno") + "】的出入库单为非新建状态,无法审核";
  490. // }
  491. // }
  492. // for (Row row : rowsdetail) {
  493. // if (row.getBigDecimal("qty").compareTo(BigDecimal.ZERO) < 1) {
  494. // return "表体数量不能小于0";
  495. // }
  496. // }
  497. // if (rows.get(0).getBigDecimal("payamount").compareTo(BigDecimal.ZERO) <= 0) {
  498. // return "扣款金额需大于0";
  499. // }
  500. // if (StringUtils.isBlank(rows.get(0).getString("outplace"))) {
  501. // return "发货地不可为空";
  502. // }
  503. // if ((rows.get(0).getBigDecimal("payamount").add(rows.get(0).getBigDecimal("paydiscountamount"))).compareTo(rowsdetail.sum("amount")) != 0) {
  504. // return "扣款金额与应扣金额不符,不能审核";
  505. // }
  506. // 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);
  507. // if (accountbalancerows.isNotEmpty()) {
  508. // BigDecimal discountamount = accountbalancerows.get(0).getBigDecimal("discountamount");
  509. // if (rows.get(0).getBigDecimal("paydiscountamount").compareTo(discountamount) > 0) {
  510. // return "优惠金额不能大于可用优惠金额";
  511. // }
  512. // } else {
  513. // return "账户不存在";
  514. // }
  515. // ArrayList<String> sqlList = new ArrayList<>();
  516. //// Rows stockRows= dbConnect.runSqlQuery("select * from st_stock where siteid='"+siteid+"'");
  517. //// RowsMap stockRowsMap =stockRows.toRowsMap("itemid");
  518. //
  519. // String order_paymentnode = Parameter.getString(siteid, "order_paymentnode");
  520. // if (rows.get(0).getBoolean("rb")) {
  521. // if (rows.get(0).getString("type").equals("销售出库")) {
  522. // if (order_paymentnode.equals("3")) {
  523. // if (Accountbalance.judgeBalance(this, sys_enterpriseid, accountbalancerows.get(0).getLong("sa_accountclassid"), rowsdetail.sum("amount"))) {
  524. // 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") + "审核时生成");
  525. // JSONObject createCashbillPay = Accountbalance.createCashbillPay(this, sys_enterpriseid, accountbalancerows.get(0).getLong("sa_accountclassid"), entity, true);
  526. // sqlList.addAll(createCashbillPay.getJSONArray("sqlList").toJavaList(String.class));
  527. // } else {
  528. // return "账户余额不足,还差" + Accountbalance.InsufficientBalance(this, sys_enterpriseid, accountbalancerows.get(0).getLong("sa_accountclassid"), rowsdetail.sum("amount")) + "元!";
  529. // }
  530. // }
  531. // 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 + ")");
  532. // RowsMap rowsMap = rowsOrderDetail.toRowsMap("sa_orderitemsid");
  533. // 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");
  534. // 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");
  535. // if (rowsjudge.isNotEmpty()) {
  536. // return "存在商品已完全出库,无法审核";
  537. // }
  538. // for (Row row : rowsDispatchDetailGroup) {
  539. // 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"));
  540. // }
  541. // for (Row row : rowsdetail) {
  542. // if (row.getBoolean("skucontrol")) {
  543. // sqlList.add("update st_stockbill_items set wmsuploadflag2=1 where st_stockbill_itemsid=" + row.getLong("st_stockbill_itemsid"));
  544. // }
  545. //
  546. // }
  547. // }
  548. //// for(Row row :rowsdetail){
  549. //// String itemid= row.getString("itemid");
  550. //// long stockid=row.getLong("stockid");
  551. //// if(stockRowsMap.containsKey(itemid)){
  552. //// for(Row row1 :stockRowsMap.get(itemid)){
  553. //// if(row1.getLong("stockid")==stockid){
  554. //// sqlList.add("update st_stock set qty="+row1.getBigDecimal("qty").add(row.getBigDecimal("qty"))+" where stockid="+stockid);
  555. //// }
  556. //// }
  557. //// }
  558. //// // String batchno = row.getString("batchno");
  559. //// }
  560. // } else {
  561. //// for(Row row :rowsdetail){
  562. //// String itemid= row.getString("itemid");
  563. //// long stockid=row.getLong("stockid");
  564. //// if(stockRowsMap.containsKey(itemid)){
  565. //// for(Row row1 :stockRowsMap.get(itemid)){
  566. //// if(row1.getLong("stockid")==stockid){
  567. //// sqlList.add("update st_stock set qty="+row1.getBigDecimal("qty").subtract(row.getBigDecimal("qty"))+" where stockid="+stockid);
  568. //// }
  569. //// }
  570. //// }
  571. //// // String batchno = row.getString("batchno");
  572. //// }
  573. // }
  574. //// 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");
  575. //// 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+"')");
  576. //// RowsMap orderRowsMap =orderRows.toRowsMap("sa_orderid");
  577. //
  578. // sqlList.addAll(updateAccountbalance_freez(st_stockbillid, isinstock));
  579. //
  580. // dbConnect.runSqlUpdate(sqlList);
  581. //// Accountbalance.remindSend(this, sys_enterpriseid, sa_cashbillid);
  582. // return "success";
  583. //
  584. // }
  585. // public String unxsckcheck(Long st_stockbillid, boolean isinstock) throws YosException {
  586. //
  587. //
  588. // Rows rows = dbConnect.runSqlQuery("select * from st_stockbill where st_stockbillid ='"
  589. // + st_stockbillid + "' and siteid='" + siteid + "'");
  590. // 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 ='"
  591. // + st_stockbillid + "' and t1.siteid='" + siteid + "'");
  592. // long sys_enterpriseid = rows.get(0).getLong("sys_enterpriseid");
  593. //
  594. // if (rows.isEmpty()) {
  595. // return "该出入库单不存在";
  596. // } else {
  597. // if (!rows.get(0).getString("status").equals("审核")) {
  598. // return "单号为:【" + rows.get(0).getString("billno") + "】的出入库单为非审核状态,无法反审核";
  599. // }
  600. // }
  601. // for (Row row : rowsdetail) {
  602. // if (row.getBigDecimal("qty").compareTo(BigDecimal.ZERO) < 1) {
  603. // return "表体数量不能小于0";
  604. // }
  605. // }
  606. // if (rows.get(0).getBigDecimal("paydiscountamount").compareTo(BigDecimal.ZERO) < 0) {
  607. // return "优惠金额不能小于0";
  608. // }
  609. // if (rows.get(0).getBigDecimal("payamount").compareTo(BigDecimal.ZERO) <= 0) {
  610. // return "扣款金额需大于0";
  611. // }
  612. // if (StringUtils.isBlank(rows.get(0).getString("outplace"))) {
  613. // return "发货地不可为空";
  614. // }
  615. // if ((rows.get(0).getBigDecimal("payamount").add(rows.get(0).getBigDecimal("paydiscountamount"))).compareTo(rowsdetail.sum("amount")) != 0) {
  616. // return "扣款金额与应扣金额不符,不能反审核";
  617. // }
  618. // 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);
  619. // if (accountbalancerows.isEmpty()) {
  620. // return "账户不存在";
  621. // }
  622. // if (rows.get(0).getString("type").equals("销售出库") && rows.get(0).getBoolean("isreceiver")) {
  623. // return "经销商已经确认收货,不可进行反审核";
  624. // }
  625. // ArrayList<String> sqlList = new ArrayList<>();
  626. //// Rows stockRows= dbConnect.runSqlQuery("select * from st_stock where siteid='"+siteid+"'");
  627. //// RowsMap stockRowsMap =stockRows.toRowsMap("itemid");
  628. //
  629. // String order_paymentnode = Parameter.getString(siteid, "order_paymentnode");
  630. // if (rows.get(0).getBoolean("rb")) {
  631. // if (rows.get(0).getString("type").equals("销售出库")) {
  632. // if (order_paymentnode.equals("3")) {
  633. // if (Accountbalance.judgeBalance(this, sys_enterpriseid, accountbalancerows.get(0).getLong("sa_accountclassid"), rowsdetail.sum("amount").negate())) {
  634. // 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") + "反审核时生成");
  635. // JSONObject createCashbillPay = Accountbalance.createCashbillPay(this, sys_enterpriseid, accountbalancerows.get(0).getLong("sa_accountclassid"), entity, true);
  636. // sqlList.addAll(createCashbillPay.getJSONArray("sqlList").toJavaList(String.class));
  637. // } else {
  638. // return "账户余额不足,还差" + Accountbalance.InsufficientBalance(this, sys_enterpriseid, accountbalancerows.get(0).getLong("sa_accountclassid"), rowsdetail.sum("amount")) + "元!";
  639. // }
  640. // }
  641. // 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 + ")");
  642. // RowsMap rowsMap = rowsOrderDetail.toRowsMap("sa_orderitemsid");
  643. // 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");
  644. // for (Row row : rowsDispatchDetailGroup) {
  645. // 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"));
  646. // }
  647. // for (Row row : rowsdetail) {
  648. // if (row.getBoolean("skucontrol")) {
  649. // sqlList.add("update st_stockbill_items set wmsuploadflag2=0 where st_stockbill_itemsid=" + row.getLong("st_stockbill_itemsid"));
  650. // }
  651. //
  652. // }
  653. // }
  654. //// for(Row row :rowsdetail){
  655. //// String itemid= row.getString("itemid");
  656. //// long stockid=row.getLong("stockid");
  657. //// if(stockRowsMap.containsKey(itemid)){
  658. //// for(Row row1 :stockRowsMap.get(itemid)){
  659. //// if(row1.getLong("stockid")==stockid){
  660. //// sqlList.add("update st_stock set qty="+row1.getBigDecimal("qty").subtract(row.getBigDecimal("qty"))+" where stockid="+stockid);
  661. //// }
  662. //// }
  663. //// }
  664. //// // String batchno = row.getString("batchno");
  665. //// }
  666. // } else {
  667. //// for(Row row :rowsdetail){
  668. //// String itemid= row.getString("itemid");
  669. //// long stockid=row.getLong("stockid");
  670. //// if(stockRowsMap.containsKey(itemid)){
  671. //// for(Row row1 :stockRowsMap.get(itemid)){
  672. //// if(row1.getLong("stockid")==stockid){
  673. //// sqlList.add("update st_stock set qty="+row1.getBigDecimal("qty").add(row.getBigDecimal("qty"))+" where stockid="+stockid);
  674. //// }
  675. //// }
  676. //// }
  677. //// // String batchno = row.getString("batchno");
  678. //// }
  679. // }
  680. //// 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");
  681. //// 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+"')");
  682. //// RowsMap orderRowsMap =orderRows.toRowsMap("sa_orderid");
  683. // sqlList.addAll(updateAccountbalance_freez(st_stockbillid, isinstock));
  684. // dbConnect.runSqlUpdate(sqlList);
  685. //
  686. //// Accountbalance.remindSend(this, sys_enterpriseid, sa_cashbillid);
  687. // return "success";
  688. // }
  689. @API(title = "仓库确认", apiversion = R.ID2025050709505703.v1.class)
  690. public String confirm() throws YosException {
  691. JSONArray st_stockbillids = content.getJSONArray("st_stockbillids");
  692. boolean isconfirm = content.getBooleanValue("isconfirm");
  693. if (st_stockbillids.isEmpty()) {
  694. return getErrReturnObject().setErrMsg("请选择需要操作的出入库单")
  695. .toString();
  696. }
  697. QuerySQL querySQL = SQLFactory.createQuerySQL(this, "st_stockbill","*");
  698. querySQL.setTableAlias("t1");
  699. querySQL.setSiteid(siteid);
  700. querySQL.setWhere("st_stockbillid",st_stockbillids);
  701. Rows rows = querySQL.query();
  702. ArrayList<String> sqllist= new ArrayList<>();
  703. for(Row row :rows){
  704. if (!row.getString("status").equals("审核")) {
  705. return getErrReturnObject().setErrMsg("单号为:【" + row.getString("billno") + "】的出入库单为非审核状态,无法进行仓库确认")
  706. .toString();
  707. }
  708. UpdateSQL updateSQL = SQLFactory.createUpdateSQL(this, "st_stockbill");
  709. updateSQL.setUniqueid(row.getLong("st_stockbillid"));
  710. updateSQL.setSiteid(siteid);
  711. updateSQL.setValue("isconfirm", isconfirm);
  712. updateSQL.setValue("confirmby", username);
  713. updateSQL.setDateValue("confirmdate");
  714. updateSQL.setValue("changeby", username);
  715. updateSQL.setDateValue("changedate");
  716. sqllist.add(updateSQL.getSQL());
  717. if(isconfirm){
  718. sqllist.add(DataContrlLog.createLog(this, "st_stockbill", row.getLong("st_stockbillid"), "仓库确认", row.getString("type")+"单仓库确认成功").getSQL());
  719. }else{
  720. sqllist.add(DataContrlLog.createLog(this, "st_stockbill", row.getLong("st_stockbillid"), "仓库反确认", row.getString("type")+"单仓库反确认成功").getSQL());
  721. }
  722. }
  723. dbConnect.runSqlUpdate(sqllist);
  724. return getSucReturnObject().toString();
  725. }
  726. @API(title = "红冲", apiversion = R.ID2025072409344603.v1.class)
  727. @CACHEING_CLEAN(apiClass = {stockbill.class, stockbillitems.class})
  728. public String hongc() throws YosException {
  729. long st_stockbillid = content.getLong("st_stockbillid");
  730. ArrayList<String> sqlList = new ArrayList<>();
  731. Rows rows = dbConnect.runSqlQuery("select t1.*,ifnull(t2.sa_sendrepairid,0) sa_sendrepairid from st_stockbill t1 left join sa_sendrepair t2 on t1.st_stockbillid=t2.sourceid and t1.siteid=t2.siteid and t2.sourcetable='st_stockbill' where t1.st_stockbillid ='"
  732. + st_stockbillid + "' and t1.siteid='" + siteid + "'");
  733. 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 ='"
  734. + st_stockbillid + "' and t1.siteid='" + siteid + "'");
  735. if (rows.isEmpty()) {
  736. return getErrReturnObject().setErrMsg("该出入库单不存在")
  737. .toString();
  738. }
  739. if (!rows.get(0).getString("status").equals("审核")) {
  740. return getErrReturnObject().setErrMsg("非审核的出入库单无法红冲")
  741. .toString();
  742. }
  743. if (rows.get(0).getInteger("rb") == 0) {
  744. return getErrReturnObject().setErrMsg("只能红冲蓝字出入库单")
  745. .toString();
  746. }
  747. if (rows.get(0).getInteger("sa_sendrepairid") != 0) {
  748. return getErrReturnObject().setErrMsg("来源于送修单的出库单不能红冲")
  749. .toString();
  750. }
  751. st_stockbillid = createTableID("st_stockbill");
  752. InsertSQL insertSQL = SQLFactory.createInsertSQL(this, "st_stockbill");
  753. insertSQL.setUniqueid(st_stockbillid);
  754. insertSQL.setSiteid(siteid);
  755. insertSQL.setValue("sys_enterpriseid", rows.get(0).getLong("sys_enterpriseid"));
  756. insertSQL.setValue("rec_contactsid", rows.get(0).getLong("rec_contactsid"));
  757. insertSQL.setValue("departmentid", rows.get(0).getLong("departmentid"));
  758. insertSQL.setValue("stockid", rows.get(0).getLong("stockid"));
  759. insertSQL.setValue("type", rows.get(0).getString("type"));
  760. insertSQL.setValue("typemx", rows.get(0).getString("typemx"));
  761. insertSQL.setValue("sa_supplierid", rows.get(0).getLong("sa_supplierid"));
  762. insertSQL.setValue("rb", 0);
  763. insertSQL.setValue("remarks", rows.get(0).getString("remarks"));
  764. insertSQL.setValue("billdate", getDateTime_Str());
  765. String billno="";
  766. if (rows.get(0).getString("type").equals("销售出库")) {
  767. billno = createBillCode("stockbill");
  768. insertSQL.setValue("billno",billno);
  769. sqlList.add(DataContrlLog.createLog(this, "st_stockbill", rows.get(0).getLong("st_stockbillid"), "红冲", "已生成红字"+rows.get(0).getString("type")+"单【"+billno+"】").getSQL());
  770. } else if (rows.get(0).getString("type").equals("其他出库")) {
  771. billno=createBillCode("STOCKBILL1");
  772. insertSQL.setValue("billno", billno);
  773. sqlList.add(DataContrlLog.createLog(this, "st_stockbill", rows.get(0).getLong("st_stockbillid"), "红冲", "已生成红字"+rows.get(0).getString("type")+"单【"+billno+"】").getSQL());
  774. } else if (rows.get(0).getString("type").equals("其他入库")) {
  775. billno=createBillCode("STOCKBILL2");
  776. insertSQL.setValue("billno", billno);
  777. sqlList.add(DataContrlLog.createLog(this, "st_stockbill", rows.get(0).getLong("st_stockbillid"), "红冲", "已生成红字"+rows.get(0).getString("type")+"单【"+billno+"】").getSQL());
  778. } else {
  779. billno=createBillCode("stockbill");
  780. insertSQL.setValue("billno", billno);
  781. sqlList.add(DataContrlLog.createLog(this, "st_stockbill", rows.get(0).getLong("st_stockbillid"), "红冲", "已生成红字"+rows.get(0).getString("type")+"单【"+billno+"】").getSQL());
  782. }
  783. insertSQL.setValue("outplace", rows.get(0).getString("outplace"));
  784. insertSQL.setValue("delivery", rows.get(0).getString("delivery"));
  785. insertSQL.setValue("invoice_enterprisename", rows.get(0).getString("invoice_enterprisename"));
  786. insertSQL.setValue("invoice_address", rows.get(0).getString("invoice_address"));
  787. insertSQL.setValue("invoice_taxno", rows.get(0).getString("invoice_taxno"));
  788. insertSQL.setValue("tracknumber", rows.get(0).getString("tracknumber"));
  789. insertSQL.setValue("isconfirm", rows.get(0).getString("isconfirm"));
  790. insertSQL.setValue("sourceobject", "st_stockbill");
  791. insertSQL.setValue("sourceid", rows.get(0).getLong("st_stockbillid"));
  792. insertSQL.setValue("period", rows.get(0).getString("period"));
  793. insertSQL.setValue("createby", username);
  794. insertSQL.setDateValue("createdate");
  795. insertSQL.setValue("changeby", username);
  796. insertSQL.setDateValue("changedate");
  797. insertSQL.setValue("status", "新建");
  798. insertSQL.setValue("payamount", rows.get(0).getString("payamount"));
  799. insertSQL.setValue("paydiscountamount", rows.get(0).getString("paydiscountamount"));
  800. sqlList.add(insertSQL.getSQL());
  801. sqlList.add(DataContrlLog.createLog(this, "st_stockbill", st_stockbillid, "新建", "由"+rows.get(0).getString("billno")+"单红冲生成").getSQL());
  802. int i = 0;
  803. for (Row row : rowsdetail) {
  804. InsertSQL insertDetailSQL = SQLFactory.createInsertSQL(this, "st_stockbill_items");
  805. insertDetailSQL.setUniqueid(createTableID("st_stockbill_items"));
  806. insertDetailSQL.setSiteid(siteid);
  807. insertDetailSQL.setValue("rowno", i + 1);
  808. insertDetailSQL.setValue("st_stockbillid", st_stockbillid);
  809. insertDetailSQL.setValue("sa_orderitemsid", row.getLong("sa_orderitemsid"));
  810. insertDetailSQL.setValue("itemid", row.getString("itemid"));
  811. insertDetailSQL.setValue("sa_orderid", row.getString("sa_orderid"));
  812. insertDetailSQL.setValue("qty", row.getString("qty"));
  813. insertDetailSQL.setValue("discountrate", row.getBigDecimal("discountrate"));
  814. insertDetailSQL.setValue("sa_dispatch_itemsid", 0);
  815. insertDetailSQL.setValue("defaultprice", row.getBigDecimal("defaultprice"));
  816. insertDetailSQL.setValue("remarks", row.getString("remarks"));
  817. insertDetailSQL.setValue("sku", row.getString("sku"));
  818. insertDetailSQL.setValue("itemno", row.getString("itemno"));
  819. insertDetailSQL.setValue("itemname", row.getString("itemname"));
  820. insertDetailSQL.setValue("model", row.getString("model"));
  821. insertDetailSQL.setValue("price", row.getBigDecimal("price"));
  822. insertDetailSQL.setValue("stockid", row.getString("stockid"));
  823. insertDetailSQL.setValue("amount", row.getBigDecimal("qty").multiply(row.getBigDecimal("price")));
  824. insertDetailSQL.setValue("untaxedprice", row.getBigDecimal("price").divide(new BigDecimal(1.13), 2, BigDecimal.ROUND_HALF_UP));
  825. insertDetailSQL.setValue("untaxedamount", row.getBigDecimal("qty").multiply(row.getBigDecimal("price").divide(new BigDecimal(1.13), 2, BigDecimal.ROUND_HALF_UP)));
  826. insertDetailSQL.setValue("sourceid", row.getLong("st_stockbill_itemsid"));
  827. insertDetailSQL.setValue("sourceobject", "st_stockbill_items");
  828. sqlList.add(insertDetailSQL.getSQL());
  829. }
  830. sqlList.add(DataContrlLog.createLog(this, "st_stockbill", st_stockbillid, "新增", "销售出库单新增成功").getSQL());
  831. dbConnect.runSqlUpdate(sqlList);
  832. content.put("st_stockbillid", st_stockbillid);
  833. return queryStockbillMain();
  834. }
  835. @API(title = "序列号收集", apiversion = R.ID2025101613261703.v1.class)
  836. @CACHEING_CLEAN(apiClass = {stockbill.class, stockbillitems.class, stockbillitemssku.class})
  837. public String skuCollect() throws YosException {
  838. long stockid = content.getLong("stockid");
  839. String sku = content.getString("sku");
  840. long st_stockbillid = content.getLong("st_stockbillid");
  841. long st_stockbill_itemsid = content.getLong("st_stockbill_itemsid");
  842. ArrayList<String> sqllist = new ArrayList<>();
  843. String ss = "&&%$&&";
  844. if (sku.contains(",")) {
  845. ss = ",";
  846. } else if (sku.contains(",")) {
  847. ss = ",";
  848. } else if (sku.contains(" ")) {
  849. ss = " ";
  850. } else if (sku.contains(";")) {
  851. ss = ";";
  852. } else if (sku.contains(";")) {
  853. ss = ";";
  854. }
  855. String[] CODE = getDistinctArray(sku.split(ss));
  856. Rows rows = dbConnect.runSqlQuery("select t1.*,t2.stockno from st_stockbill t1 left join st_stock t2 on t1.stockid=t2.stockid where t1.st_stockbillid ='"
  857. + st_stockbillid + "' and t1.siteid='" + siteid + "'");
  858. Rows stockbillitemsrows = dbConnect.runSqlQuery("select t1.itemid,t1.qty,t2.skucontrol from st_stockbill_items t1 left join plm_item t2 on t1.itemid=t2.itemid where t1.st_stockbillid ='"
  859. + st_stockbillid + "' and t1.siteid='" + siteid + "'");
  860. Rows stockbillitemskurows = dbConnect.runSqlQuery("select * from st_stockbill_items_sku where st_stockbillid ='"
  861. + st_stockbillid + "' and siteid='" + siteid + "'");
  862. QuerySQL skuQuerySQL = SQLFactory.createQuerySQL(this, "sa_itemsku","*");
  863. skuQuerySQL.setTableAlias("t1");
  864. skuQuerySQL.addJoinTable(JOINTYPE.left, "plm_item", "t2", "t1.itemid=t2.itemid","itemno");
  865. skuQuerySQL.addJoinTable(JOINTYPE.left, "st_stock", "t3", "t1.stockid=t3.stockid","stockno");
  866. skuQuerySQL.setWhere("t1.siteid",siteid);
  867. skuQuerySQL.setWhere("t1.sku",CODE);
  868. Rows skuRows =skuQuerySQL.query();
  869. RowsMap skuRowsMap = skuRows.toRowsMap("sku");
  870. if (rows.isEmpty()) {
  871. return getErrReturnObject().setErrMsg("该出入库单不存在")
  872. .toString();
  873. }
  874. Row st_stockbill = rows.get(0);
  875. for (String FMACHINECODE : CODE) {
  876. if (FMACHINECODE.equals("")) {
  877. continue;
  878. }
  879. if (st_stockbill.getString("type").contains("入库")
  880. && FMACHINECODE.startsWith("66")) {
  881. return getErrReturnObject().setErrMsg("序列号" + FMACHINECODE
  882. + "不可在DRP手工入库").toString();
  883. }
  884. if (st_stockbill.getString("status").equals("审核") && stockbillitemskurows.size() == stockbillitemsrows.toRowsMap("skucontrol").get("1").sum("qty").intValue()) {
  885. return getErrReturnObject().setErrMsg("序列号数量已经满足,不可继续添加").toString();
  886. }
  887. if (stockbillitemskurows.toRowsMap("sku").containsKey(FMACHINECODE)) {
  888. return getErrReturnObject().setErrMsg("序列号" + FMACHINECODE + "重复").toString();
  889. }
  890. if (!skuRowsMap.containsKey(FMACHINECODE)) {
  891. return getErrReturnObject().setErrMsg("序列号" + FMACHINECODE + "不存在").toString();
  892. } else {
  893. if (skuRowsMap.get(FMACHINECODE).get(0).getString("status").equals("报废")) {
  894. return getErrReturnObject().setErrMsg("该序列号已作废").toString();
  895. }
  896. long skustockid = skuRowsMap.get(FMACHINECODE).get(0).getLong(
  897. "stockid");
  898. long skuitemid = skuRowsMap.get(FMACHINECODE).get(0).getLong("itemid");
  899. String skuitemno = skuRowsMap.get(FMACHINECODE).get(0).getString("itemno");
  900. if (st_stockbill.getString("status").equals("审核")) {
  901. Rows stockbillskucheckRows = dbConnect.runSqlQuery("select * from stockbillskucheck where itemid=" + skuitemid + " and st_stockbillid=" + st_stockbillid);
  902. if (!stockbillskucheckRows.isEmpty()) {
  903. return getErrReturnObject().setErrMsg("商品编号" + skuitemno
  904. + stockbillskucheckRows.get(0)
  905. .getString("msg")).toString();
  906. }
  907. }
  908. if (skustockid != 0 && isinstock(st_stockbill.getString("type"), st_stockbill.getString("rb"), true)) {
  909. return getErrReturnObject().setErrMsg("该序列号不可进行入库操作").toString();
  910. }
  911. if (skustockid == 0 && !isinstock(st_stockbill.getString("type"), st_stockbill.getString("rb"), true)) {
  912. return getErrReturnObject().setErrMsg("该序列号不可进行出库操作").toString();
  913. }
  914. if (skustockid == 0 && stockid == 0) {
  915. return getErrReturnObject().setErrMsg("请指定仓库").toString();
  916. }
  917. if (!stockbillitemsrows.toRowsMap("skucontrol").get("1").toRowsMap("itemid").containsKey(
  918. skuRowsMap.get(FMACHINECODE).get(0).getString("itemid"))) {
  919. return getErrReturnObject().setErrMsg("序列号所属的商品编号没有包含在单据表体中").toString();
  920. }
  921. if (st_stockbill.getString("type").equals("生产入库")
  922. && skuRowsMap.get("FMACHINECODE").get(0).getString("mono")
  923. .equals("")) {
  924. return getErrReturnObject().setErrMsg("序列号非生产订单生成,不可添加").toString();
  925. }
  926. // if (st_stockbill.getString("type").equals("其他入库")
  927. // && st_stockbill.getString("stockno").equals("101")
  928. // && !getPaoSet(
  929. // "MACHINECODEUSEVIEW",
  930. // "MACHINECODEUSEVIEW",
  931. // "fmachinecode='" + FMACHINECODE
  932. // + "' and ftype like'%出库%'")
  933. // .isEmpty()) {
  934. // ((PaoSet) getThisPaoSet())
  935. // .addWarning(new P2AppException("", "序列号"
  936. // + FMACHINECODE + "已存在出库记录,请确认该序列号是否有误"));
  937. // }
  938. String stockno = st_stockbill.getString("type").equals("销售出库")
  939. && (skuRowsMap.get(FMACHINECODE).get(0).getString("stockno")
  940. .equals("103") || skuRowsMap.get(FMACHINECODE).get(0).getString("stockno").equals("109")) ? "101"
  941. : skuRowsMap.get(FMACHINECODE).get(0).getString("stockno");
  942. Rows stockrows = dbConnect.runSqlQuery("select *from st_stock where stockno='" + stockno + "'");
  943. if(st_stockbill_itemsid>0 && dbConnect.runSqlQuery("select 1 from st_stockbill_items_sku where st_stockbillid=st_stockbill_itemsid and st_stockbillid="+st_stockbillid).size()>0){
  944. scanqtyrefresh();
  945. }
  946. InsertSQL insertSQL = SQLFactory.createInsertSQL(this, "st_stockbill_items_sku");
  947. long st_stockbill_items_skuid = createTableID("st_stockbill_items_sku");
  948. insertSQL.setUniqueid(st_stockbill_items_skuid);
  949. insertSQL.setSiteid(siteid);
  950. if (stockrows.isNotEmpty()) {
  951. skustockid = stockrows.get(0).getLong("stockid");
  952. }
  953. if (stockid == 0) {
  954. skustockid = st_stockbill.getLong("stockid");
  955. }
  956. insertSQL.setValue("stockid", skustockid);
  957. insertSQL.setValue("itemid", skuitemid);
  958. insertSQL.setValue("sku", FMACHINECODE);
  959. insertSQL.setValue("st_stockbillid", st_stockbillid);
  960. insertSQL.setValue("st_stockbill_itemsid", st_stockbill_itemsid==0?st_stockbillid:st_stockbill_itemsid);
  961. sqllist.add(insertSQL.getSQL());
  962. if (st_stockbill.getString("status").equals("审核")) {
  963. if (isinstock(st_stockbill.getString("type"), st_stockbill.getString("rb"), true)) {
  964. sqllist.add("update sa_itemsku set stockid=" + skustockid + " where sku='" + FMACHINECODE + "'");
  965. if (st_stockbill.getString("type").equals("销售出库")) {
  966. sqllist.add("update sa_itemsku set sa_agentsid=0 where sku='" + FMACHINECODE + "'");
  967. }
  968. } else {
  969. sqllist.add("update sa_itemsku set stockid=0 where sku='" + FMACHINECODE + "'");
  970. if (st_stockbill.getString("type").equals("销售出库")) {
  971. sqllist.add("update sa_itemsku set sa_agentsid=(select sa_agentsid from sa_agents where sys_enterpriseid=" + st_stockbill.getLong("sys_enterpriseid") + ") where sku='" + FMACHINECODE + "'");
  972. if (st_stockbill.getBoolean("iswx")) {
  973. sqllist.add("update sa_itemsku set stockid=(select stockid from st_stock where stockno='00') where sku='" + FMACHINECODE + "'");
  974. }
  975. }
  976. }
  977. }
  978. }
  979. }
  980. dbConnect.runSqlUpdate(sqllist);
  981. return getSucReturnObject().toString();
  982. }
  983. @API(title = "扫描数量刷新", apiversion = R.ID2025102215584903.v1.class)
  984. @CACHEING_CLEAN(apiClass = {stockbill.class, stockbillitems.class, stockbillitemssku.class})
  985. public String scanqtyrefresh() throws YosException {
  986. long st_stockbillid = content.getLong("st_stockbillid");
  987. ArrayList<String> sqllist = new ArrayList<>();
  988. Rows stockbillskuRows = dbConnect.runSqlQuery("select t1.sku,t2.itemid,t1.st_stockbill_items_skuid from st_stockbill_items_sku t1 left join sa_itemsku t2 on t1.sku=t2.sku where t1.st_stockbillid=t1.st_stockbill_itemsid and t1.st_stockbillid="+st_stockbillid);
  989. Rows stockbilldetailRows = dbConnect.runSqlQuery("select t1.itemid,t1.st_stockbill_itemsid from st_stockbill_items t1 where t1.st_stockbillid="+st_stockbillid);
  990. RowsMap stockbilldetailRowsMap = stockbilldetailRows.toRowsMap("itemid");
  991. for(Row row :stockbillskuRows){
  992. String itemid = row.getString("itemid");
  993. long st_stockbill_items_skuid =row.getLong("st_stockbill_items_skuid");
  994. if(stockbilldetailRowsMap.containsKey(itemid)){
  995. sqllist.add("update st_stockbill_items_sku set st_stockbill_itemsid="+stockbilldetailRowsMap.get(itemid).get(0).getLong("st_stockbill_itemsid")+" where st_stockbill_items_skuid="+st_stockbill_items_skuid);
  996. }
  997. }
  998. dbConnect.runSqlUpdate(sqllist);
  999. return getSucReturnObject().toString();
  1000. }
  1001. @API(title = "批量建快递信息单", apiversion = R.ID2025110810253603.v1.class)
  1002. public String insertexpressforms() throws YosException {
  1003. ArrayList<String> sqlList = new ArrayList<>();
  1004. // 表名
  1005. String tableName = "expressform";
  1006. long expresssdrid = content.getLong("expresssdrid");
  1007. String province = content.getStringValue("province");
  1008. String city = content.getStringValue("city");
  1009. String county = content.getStringValue("county");
  1010. String phonenumber = content.getStringValue("phonenumber");
  1011. String address = content.getStringValue("address");
  1012. BigDecimal agencyfund = content.getBigDecimal("agencyfund");
  1013. JSONArray st_stockbillids=content.getJSONArray("st_stockbillids");
  1014. QuerySQL stockbillQuerySQL = SQLFactory.createQuerySQL(this, "st_stockbill","*");
  1015. stockbillQuerySQL.setTableAlias("t1");
  1016. stockbillQuerySQL.addJoinTable(JOINTYPE.left, "sys_enterprise_contacts", "t2", "t2.contactsid=t1.rec_contactsid and t1.siteid=t2.siteid");
  1017. stockbillQuerySQL.addQueryFields("rec_name","t2.name");
  1018. stockbillQuerySQL.addQueryFields("rcv_phone","t2.phonenumber");
  1019. stockbillQuerySQL.addQueryFields("rcv_mobile","t2.telephone");
  1020. stockbillQuerySQL.addQueryFields("rcv_prov","t2.province");
  1021. stockbillQuerySQL.addQueryFields("rcv_city","t2.city");
  1022. stockbillQuerySQL.addQueryFields("rcv_county","t2.county");
  1023. stockbillQuerySQL.addQueryFields("rcv_address","t2.address");
  1024. stockbillQuerySQL.setWhere("t1.siteid",siteid);
  1025. stockbillQuerySQL.setWhere("t1.st_stockbillid",st_stockbillids);
  1026. stockbillQuerySQL.setWhere("t1.type='销售出库'");
  1027. Rows stockbillRows =stockbillQuerySQL.query();
  1028. for(Row row :stockbillRows){
  1029. long expressformid = createTableID(tableName);
  1030. InsertSQL insertSQL = SQLFactory.createInsertSQL(this, tableName);
  1031. insertSQL.setUniqueid(expressformid);
  1032. insertSQL.setSiteid(siteid);
  1033. insertSQL.setValue("logisticproviderid", "YTO");
  1034. insertSQL.setValue("ordertype", "4");
  1035. insertSQL.setValue("agencyfund", agencyfund);
  1036. insertSQL.setValue("itemname", "配件");
  1037. insertSQL.setValue("number", 1);
  1038. insertSQL.setValue("fpriority_ads", "配件>常规");
  1039. insertSQL.setValue("sys_enterpriseid", row.getLong("sys_enterpriseid"));
  1040. insertSQL.setValue("rcv_name", row.getString("rcv_name"));
  1041. insertSQL.setValue("rcv_phone", row.getString("rcv_phone"));
  1042. insertSQL.setValue("rcv_mobile", row.getString("rcv_mobile"));
  1043. insertSQL.setValue("rcv_postcode", "");
  1044. insertSQL.setValue("rcv_prov", row.getString("rcv_prov"));
  1045. insertSQL.setValue("rcv_city", row.getString("rcv_city"));
  1046. insertSQL.setValue("rcv_county", row.getString("rcv_county"));
  1047. insertSQL.setValue("rcv_address", row.getString("rcv_address"));
  1048. insertSQL.setValue("expresssdrid", expresssdrid);
  1049. insertSQL.setValue("remarks", "");
  1050. insertSQL.setValue("mailno", "");
  1051. insertSQL.setValue("province", province);
  1052. insertSQL.setValue("city", city);
  1053. insertSQL.setValue("county", county);
  1054. insertSQL.setValue("phonenumber", phonenumber);
  1055. insertSQL.setValue("address", address);
  1056. insertSQL.setValue("txlogisticid", createBillCode("logisticsbill"));
  1057. insertSQL.setValue("createby", username);
  1058. insertSQL.setDateValue("createdate");
  1059. insertSQL.setValue("changeby", username);
  1060. insertSQL.setDateValue("changedate");
  1061. insertSQL.setValue("status", "新建");
  1062. sqlList.add(insertSQL.getSQL());
  1063. sqlList.add(DataContrlLog.createLog(this, "expressform", expressformid, "新增", "快递信息新增成功").getSQL());
  1064. InsertSQL insertBindSQL =SQLFactory.createInsertSQL(this,"sa_expressform_stockbill");
  1065. insertBindSQL.setUniqueid(createTableID("sa_expressform_stockbill"));
  1066. insertBindSQL.setSiteid(siteid);
  1067. insertBindSQL.setValue("st_stockbillid", row.getLong("st_stockbillid"));
  1068. insertBindSQL.setValue("expressformid", expressformid);
  1069. sqlList.add(insertBindSQL.getSQL());
  1070. }
  1071. dbConnect.runSqlUpdate(sqlList);
  1072. return getSucReturnObject().toString();
  1073. }
  1074. @API(title = "更新站点信息详情详情", apiversion = R.ID20230720143503.v1.class)
  1075. public String updateParameterSiteInfo() throws YosException {
  1076. BigDecimal icstockbillrebaterate = content.getBigDecimal("icstockbillrebaterate");
  1077. Long icstockbillrebateaccount = content.getLong("icstockbillrebateaccount");
  1078. dbConnect.runSqlUpdate("update sys_site_parameter set icstockbillrebaterate='" + icstockbillrebaterate + "',icstockbillrebateaccount='" + icstockbillrebateaccount + "' where siteid='" + siteid + "'");
  1079. return getSucReturnObject().toString();
  1080. }
  1081. @API(title = "站点信息详情", apiversion = R.ID20230720143603.v1.class)
  1082. public String queryParameterSiteInfo() throws YosException {
  1083. Rows rows = dbConnect.runSqlQuery("select icstockbillrebateaccount,icstockbillrebaterate from sys_site_parameter where siteid='" + siteid + "'");
  1084. Row row = rows.isNotEmpty() ? rows.get(0) : new Row();
  1085. return getSucReturnObject().setData(row).toString();
  1086. }
  1087. @API(title = "下载销售出库单导入单模板", apiversion = R.ID2025111309451103.v1.class)
  1088. public String downloadstockbillExcel() throws YosException {
  1089. ExcelFactory excelFactory = new ExcelFactory("ImportTemplateForStockbill");
  1090. XSSFSheet sheet = excelFactory.getXssfWorkbook().createSheet("Sheet1");
  1091. XSSFWorkbook xssfFWorkbook = excelFactory.getXssfWorkbook();
  1092. CellStyle style = xssfFWorkbook.createCellStyle();
  1093. // 设置为文本格式,防止身份证号变成科学计数法
  1094. DataFormat format = xssfFWorkbook.createDataFormat();
  1095. // 对单独某一列进行样式赋值,第一个参数为列数,第二个参数为样式
  1096. style.setDataFormat(format.getFormat("@"));
  1097. // 对单独某一列进行样式赋值,第一个参数为列数,第二个参数为样式
  1098. for (int i = 0; i <= 13; i++) {
  1099. sheet.setDefaultColumnStyle(i, style);
  1100. }
  1101. ExportExcelSpecial.setBatchDetailSheetColumn1(sheet);// 设置工作薄列宽
  1102. XSSFCellStyle titleCellStyle1 = ExportExcelSpecial.createTitleCellStyle1(xssfFWorkbook);
  1103. XSSFCellStyle titleCellStyle2 = ExportExcelSpecial.createTitleCellStyle2(xssfFWorkbook);
  1104. XSSFCellStyle titleCellStyle3 = ExportExcelSpecial.createTitleCellStyle3(xssfFWorkbook);
  1105. XSSFCellStyle titleCellStyle4 = ExportExcelSpecial.createBodyCellStyle4(xssfFWorkbook);
  1106. ExportExcelSpecial.batchDetail(sheet, titleCellStyle1, titleCellStyle2, titleCellStyle3, titleCellStyle4,
  1107. xssfFWorkbook);// 写入标题
  1108. Rows aa = saveToExcelAttachment(excelFactory);
  1109. String url = "";
  1110. if (!aa.isEmpty()) {
  1111. url = aa.get(0).getString("url");
  1112. }
  1113. return getSucReturnObject().setData(url).toString();
  1114. }
  1115. @API(title = "导入销售出库单", apiversion = R.ID2025111309451703.v1.class)
  1116. @CACHEING_CLEAN(apiClass = {stockbill.class, stockbillitems.class, stockbillitemssku.class})
  1117. public String uploadstockbillByExcel() throws YosException {
  1118. ArrayList<String> sqlList = new ArrayList<>();
  1119. ExcelFactory e;
  1120. try {
  1121. if (content.getLongValue("attachmentid") > 0) {
  1122. e = getExcelAttachment(content.getLongValue("attachmentid"));
  1123. // 本地
  1124. //e = getPostExcelFactory();
  1125. } else {
  1126. e = getPostExcel();
  1127. // 本地
  1128. //e = getPostExcelFactory();
  1129. }
  1130. ArrayList<String> keys = new ArrayList<>();
  1131. keys.add("type");
  1132. keys.add("depno");
  1133. keys.add("agentnum");
  1134. keys.add("remarks");
  1135. keys.add("payamount");
  1136. keys.add("paydiscountamount");
  1137. keys.add("outplace");
  1138. keys.add("rb");
  1139. keys.add("itemno");
  1140. keys.add("stockno");
  1141. keys.add("qty");
  1142. keys.add("defaultprice");
  1143. keys.add("discountrate");
  1144. Rows rows = e.getSheetRows(0, keys, 3);
  1145. boolean iserr = false;
  1146. Rows rowserr = new Rows();
  1147. Rows rowssuc = new Rows();
  1148. RowsMap stockRowsMap = SQLFactory.createQuerySQL(this, "st_stock", "stockid", "stockno").query().toRowsMap("stockno");
  1149. RowsMap depRowsMap = SQLFactory.createQuerySQL(this, "sys_department", "departmentid", "depno").query().toRowsMap("depno");
  1150. QuerySQL agentquerySQL = SQLFactory.createQuerySQL(this, "sa_agents", "agentnum","sys_enterpriseid");
  1151. agentquerySQL.setTableAlias("t1");
  1152. agentquerySQL.addJoinTable(JOINTYPE.left,"sys_enterprise_contacts","t2","t1.sys_enterpriseid=t2.sys_enterpriseid","contactsid","name","phonenumber");
  1153. agentquerySQL.addJoinTable(JOINTYPE.left,"sys_enterprise_finance","t3","t1.sys_enterpriseid=t3.sys_enterpriseid","enterprisename","taxno","address");
  1154. agentquerySQL.setSiteid(siteid);
  1155. agentquerySQL.setWhere("t1.agentnum",rows.toArrayList("agentnum"));
  1156. Rows agentsRows = agentquerySQL.query();
  1157. RowsMap agentsRowsMap =agentsRows.toRowsMap("agentnum");
  1158. QuerySQL querySQL = SQLFactory.createQuerySQL(this, "plm_item", "itemid","itemno","itemname","model","skucontrol");
  1159. querySQL.setTableAlias("t1");
  1160. querySQL.setSiteid(siteid);
  1161. querySQL.setWhere("t1.itemno",rows.toArrayList("itemno"));
  1162. Rows itemrows = querySQL.query();
  1163. RowsMap itemRowsMap =itemrows.toRowsMap("itemno");
  1164. for (Row row : rows) {
  1165. if (!(StringUtils.isBlank(row.getString("type"))
  1166. && StringUtils.isBlank(row.getString("depno"))
  1167. && StringUtils.isBlank(row.getString("agentnum"))
  1168. && StringUtils.isBlank(row.getString("remarks"))
  1169. && StringUtils.isBlank(row.getString("payamount"))
  1170. && StringUtils.isBlank(row.getString("paydiscountamount"))
  1171. && StringUtils.isBlank(row.getString("outplace"))
  1172. && StringUtils.isBlank(row.getString("rb")))) {
  1173. if(StringUtils.isBlank(row.getString("type"))
  1174. || StringUtils.isBlank(row.getString("rb"))
  1175. || StringUtils.isBlank(row.getString("outplace"))
  1176. || StringUtils.isBlank(row.getString("agentnum"))){
  1177. iserr = true;
  1178. row.put("msg", "错误信息:类型/红蓝字/发货地/经销商编码不能为空");
  1179. rowserr.add(row);
  1180. continue;
  1181. }
  1182. if (!agentsRowsMap.containsKey(row.getString("agentnum"))) {
  1183. iserr = true;
  1184. row.put("msg", "错误信息:经销商编号不存在");
  1185. rowserr.add(row);
  1186. continue;
  1187. }
  1188. if (!row.getString("rb").equals("红") && !row.getString("rb").equals("蓝") ) {
  1189. iserr = true;
  1190. row.put("msg", "错误信息:红蓝字只能填写红或蓝");
  1191. rowserr.add(row);
  1192. continue;
  1193. }
  1194. if (!row.getString("outplace").equals("谈桥") && !row.getString("outplace").equals("马桥") ) {
  1195. iserr = true;
  1196. row.put("msg", "错误信息:发货地只能填写谈桥或马桥");
  1197. rowserr.add(row);
  1198. continue;
  1199. }
  1200. if (!row.getString("type").equals("销售出库")
  1201. && !row.getString("outplace").equals("其他入库")
  1202. && !row.getString("outplace").equals("其他出库")) {
  1203. iserr = true;
  1204. row.put("msg", "错误信息:出入库单类型错误");
  1205. rowserr.add(row);
  1206. continue;
  1207. }
  1208. if(!itemRowsMap.containsKey(row.getString("itemno"))){
  1209. iserr = true;
  1210. row.put("msg", "错误信息:品号不存在");
  1211. rowserr.add(row);
  1212. continue;
  1213. }
  1214. if(!isNumeric(row.getString("paydiscountamount"))){
  1215. iserr = true;
  1216. row.put("msg", "优惠金额不为数字格式,请检查");
  1217. rowserr.add(row);
  1218. continue;
  1219. }
  1220. if(!isNumeric(row.getString("payamount"))){
  1221. iserr = true;
  1222. row.put("msg", "扣款金额不为数字格式,请检查");
  1223. rowserr.add(row);
  1224. continue;
  1225. }
  1226. if(!isNumeric(row.getString("qty"))){
  1227. iserr = true;
  1228. row.put("msg", "数量不为数字格式,请检查");
  1229. rowserr.add(row);
  1230. continue;
  1231. }
  1232. if(!isNumeric(row.getString("defaultprice"))){
  1233. iserr = true;
  1234. row.put("msg", "原价不为数字格式,请检查");
  1235. rowserr.add(row);
  1236. continue;
  1237. }
  1238. if(!isNumeric(row.getString("discountrate"))){
  1239. iserr = true;
  1240. row.put("msg", "折扣率不为数字格式,请检查");
  1241. rowserr.add(row);
  1242. continue;
  1243. }else{
  1244. if(row.getDouble("discountrate")>1){
  1245. iserr = true;
  1246. row.put("msg", "折扣率不能大于1,请检查");
  1247. rowserr.add(row);
  1248. continue;
  1249. }
  1250. }
  1251. }else{
  1252. if(!itemRowsMap.containsKey(row.getString("itemno"))){
  1253. iserr = true;
  1254. row.put("msg", "错误信息:品号不存在");
  1255. rowserr.add(row);
  1256. continue;
  1257. }
  1258. if(!isNumeric(row.getString("qty"))){
  1259. iserr = true;
  1260. row.put("msg", "数量不为数字格式,请检查");
  1261. rowserr.add(row);
  1262. continue;
  1263. }
  1264. if(!isNumeric(row.getString("defaultprice"))){
  1265. iserr = true;
  1266. row.put("msg", "原价不为数字格式,请检查");
  1267. rowserr.add(row);
  1268. continue;
  1269. }
  1270. if(!isNumeric(row.getString("discountrate"))){
  1271. iserr = true;
  1272. row.put("msg", "折扣率不为数字格式,请检查");
  1273. rowserr.add(row);
  1274. continue;
  1275. }else{
  1276. if(row.getDouble("discountrate")>1){
  1277. iserr = true;
  1278. row.put("msg", "折扣率不能大于1,请检查");
  1279. rowserr.add(row);
  1280. continue;
  1281. }
  1282. }
  1283. }
  1284. rowssuc.add(row);
  1285. }
  1286. Rows rowsResult =new Rows();
  1287. Rows rowsdetail =new Rows();
  1288. Row rowresult=new Row();
  1289. int i=0;
  1290. for (Row row : rowssuc) {
  1291. if(StringUtils.isNotBlank(row.getString("agentnum"))
  1292. && StringUtils.isNotBlank(row.getString("type"))
  1293. && StringUtils.isNotBlank(row.getString("rb"))
  1294. && StringUtils.isNotBlank(row.getString("outplace"))){
  1295. rowresult.put("iteminfos",rowsdetail);
  1296. rowsResult.add(rowresult);
  1297. rowresult= new Row();
  1298. rowresult.put("type",row.getString("type"));
  1299. rowresult.put("depno",row.getString("depno"));
  1300. rowresult.put("agentnum",row.getString("agentnum"));
  1301. rowresult.put("remarks",row.getString("remarks"));
  1302. rowresult.put("payamount",StringUtils.isNotBlank(row.getString("payamount"))?row.getDouble("payamount"):0);
  1303. rowresult.put("paydiscountamount",StringUtils.isNotBlank(row.getString("paydiscountamount"))?row.getDouble("paydiscountamount"):0);
  1304. rowresult.put("rb",row.getString("rb"));
  1305. rowresult.put("outplace",row.getString("outplace"));
  1306. rowsdetail =new Rows();
  1307. Row rowdetail=new Row();
  1308. rowdetail.put("itemno",row.getString("itemno"));
  1309. rowdetail.put("stockno",row.getString("stockno"));
  1310. rowdetail.put("qty",row.getString("qty"));
  1311. rowdetail.put("defaultprice",row.getString("defaultprice"));
  1312. rowdetail.put("discountrate",row.getString("discountrate"));
  1313. rowsdetail.add(rowdetail);
  1314. }else{
  1315. Row rowdetail=new Row();
  1316. rowdetail.put("itemno",row.getString("itemno"));
  1317. rowdetail.put("stockno",row.getString("stockno"));
  1318. rowdetail.put("qty",row.getString("qty"));
  1319. rowdetail.put("defaultprice",row.getString("defaultprice"));
  1320. rowdetail.put("discountrate",row.getString("discountrate"));
  1321. rowsdetail.add(rowdetail);
  1322. }
  1323. i++;
  1324. if(i==rows.size()){
  1325. rowresult.put("iteminfos",rowsdetail);
  1326. rowsResult.add(rowresult);
  1327. }
  1328. }
  1329. if (iserr) {
  1330. ExcelFactory excelFactory = new ExcelFactory("出入库单导入错误信息");
  1331. HashMap<String, String> map = new HashMap<String, String>();
  1332. map.put("type", "类型");
  1333. map.put("depno", "部门编号");
  1334. map.put("agentnum", "经销商编号");
  1335. map.put("remarks", "备注");
  1336. map.put("payamount", "扣款金额");
  1337. map.put("paydiscountamount", "优惠金额");
  1338. map.put("outplace", "发货地");
  1339. map.put("rb", "红蓝字");
  1340. map.put("itemno", "品号");
  1341. map.put("stockno", "仓库编号");
  1342. map.put("qty", "数量");
  1343. map.put("defaultprice", "原价");
  1344. map.put("discountrate", "折扣率");
  1345. map.put("msg", "错误信息");
  1346. ArrayList<String> colNameList = new ArrayList<String>();
  1347. HashMap<String, Class> keytypemap = new HashMap<String, Class>();
  1348. colNameList.add("type");
  1349. colNameList.add("depno");
  1350. colNameList.add("agentnum");
  1351. colNameList.add("remarks");
  1352. colNameList.add("payamount");
  1353. colNameList.add("paydiscountamount");
  1354. colNameList.add("outplace");
  1355. colNameList.add("rb");
  1356. colNameList.add("itemno");
  1357. colNameList.add("stockno");
  1358. colNameList.add("qty");
  1359. colNameList.add("defaultprice");
  1360. colNameList.add("discountrate");
  1361. colNameList.add("msg");
  1362. keytypemap.put("type", String.class);
  1363. keytypemap.put("depno", String.class);
  1364. keytypemap.put("agentnum", String.class);
  1365. keytypemap.put("remarks", String.class);
  1366. keytypemap.put("payamount", String.class);
  1367. keytypemap.put("paydiscountamount", String.class);
  1368. keytypemap.put("outplace", String.class);
  1369. keytypemap.put("rb", String.class);
  1370. keytypemap.put("itemno", String.class);
  1371. keytypemap.put("stockno", String.class);
  1372. keytypemap.put("qty", String.class);
  1373. keytypemap.put("defaultprice", String.class);
  1374. keytypemap.put("discountrate", String.class);
  1375. keytypemap.put("msg", String.class);
  1376. rowserr.setFieldList(colNameList);
  1377. rowserr.setFieldTypeMap(keytypemap);
  1378. addSheet(excelFactory, "Sheet1", rowserr, map);
  1379. Rows aa = saveToExcelAttachment(excelFactory);
  1380. String url = "";
  1381. if (!aa.isEmpty()) {
  1382. url = aa.get(0).getString("url");
  1383. }
  1384. return getSucReturnObject().setData(url).toString();
  1385. }
  1386. if (!rowsResult.isEmpty()) {
  1387. int a = 0;
  1388. for (Row row : rowsResult) {
  1389. if(a==0){
  1390. a++;
  1391. continue;
  1392. }
  1393. long st_stockbillid = createTableID("st_stockbill");
  1394. InsertSQL insertSQL = SQLFactory.createInsertSQL(this, "st_stockbill");
  1395. insertSQL.setUniqueid(st_stockbillid);
  1396. insertSQL.setSiteid(siteid);
  1397. insertSQL.setValue("sys_enterpriseid", agentsRowsMap.get(row.getString("agentnum")).get(0).getLong("sys_enterpriseid"));
  1398. insertSQL.setValue("rec_contactsid", agentsRowsMap.get(row.getString("agentnum")).get(0).getLong("contactsid"));
  1399. insertSQL.setValue("departmentid", depRowsMap.containsKey(row.getString("depno"))?depRowsMap.get(row.getString("depno")).get(0).getLong("departmentid"):0);
  1400. insertSQL.setValue("stockid", 0);
  1401. insertSQL.setValue("type", "销售出库");
  1402. insertSQL.setValue("typemx", "");
  1403. insertSQL.setValue("sa_supplierid", 0);
  1404. insertSQL.setValue("rb", 1);
  1405. insertSQL.setValue("remarks", row.getString("remarks"));
  1406. insertSQL.setDateValue("billdate");
  1407. insertSQL.setValue("billno", createBillCode("stockbill"));
  1408. insertSQL.setValue("outplace", row.getString("outplace"));
  1409. insertSQL.setValue("delivery", "到付");
  1410. insertSQL.setValue("invoice_enterprisename", agentsRowsMap.get(row.getString("agentnum")).get(0).getString("enterprisename"));
  1411. insertSQL.setValue("invoice_address", agentsRowsMap.get(row.getString("agentnum")).get(0).getString("address"));
  1412. insertSQL.setValue("invoice_taxno", agentsRowsMap.get(row.getString("agentnum")).get(0).getString("taxno"));
  1413. insertSQL.setValue("tracknumber", "");
  1414. insertSQL.setValue("isconfirm", 0);
  1415. insertSQL.setValue("period", getDate_Str().substring(0, 7));
  1416. insertSQL.setValue("createby", username);
  1417. insertSQL.setDateValue("createdate");
  1418. insertSQL.setValue("changeby", username);
  1419. insertSQL.setDateValue("changedate");
  1420. insertSQL.setValue("status", "新建");
  1421. insertSQL.setValue("payamount", row.getDouble("payamount"));
  1422. insertSQL.setValue("paydiscountamount",row.getDouble("paydiscountamount"));
  1423. sqlList.add(insertSQL.getSQL());
  1424. sqlList.add(DataContrlLog.createLog(this, "st_stockbill", st_stockbillid, "新增", "销售出库单新增成功").getSQL());
  1425. int j = 1;
  1426. BigDecimal payamount =BigDecimal.ZERO;
  1427. for (Row rowdetail : row.getRows("iteminfos")) {
  1428. payamount=payamount.add(row.getBigDecimal("undeliqty").multiply(row.getBigDecimal("price")));
  1429. insertSQL = SQLFactory.createInsertSQL(this, "st_stockbill_items");
  1430. insertSQL.setUniqueid(createTableID("st_stockbill_items"));
  1431. insertSQL.setSiteid(siteid);
  1432. insertSQL.setValue("rowno",j);
  1433. insertSQL.setValue("st_stockbillid", st_stockbillid);
  1434. insertSQL.setValue("sa_orderitemsid",0);
  1435. insertSQL.setValue("itemid", itemRowsMap.get(rowdetail.getString("itemno")).get(0).getLong("itemid"));
  1436. insertSQL.setValue("sa_orderid",0);
  1437. insertSQL.setValue("stockid",stockRowsMap.get(rowdetail.getString("stockno")).get(0).getLong("stockid"));
  1438. insertSQL.setValue("qty", rowdetail.getDouble("qty"));
  1439. insertSQL.setValue("discountrate", rowdetail.getDouble("discountrate"));
  1440. insertSQL.setValue("sa_dispatch_itemsid", 0);
  1441. insertSQL.setValue("defaultprice", rowdetail.getDouble("defaultprice"));
  1442. insertSQL.setValue("remarks","");
  1443. insertSQL.setValue("itemno",rowdetail.getString("itemno"));
  1444. insertSQL.setValue("itemname", itemRowsMap.get(rowdetail.getString("itemno")).get(0).getString("itemname"));
  1445. insertSQL.setValue("model", itemRowsMap.get(rowdetail.getString("itemno")).get(0).getString("model"));
  1446. insertSQL.setValue("price", new BigDecimal(rowdetail.getDouble("defaultprice")).multiply(new BigDecimal(rowdetail.getDouble("discountrate"))));
  1447. insertSQL.setValue("amount", new BigDecimal(rowdetail.getDouble("defaultprice")).multiply(new BigDecimal(rowdetail.getDouble("discountrate"))).multiply(new BigDecimal(rowdetail.getDouble("qty"))));
  1448. insertSQL.setValue("untaxedprice", new BigDecimal(rowdetail.getDouble("defaultprice")).multiply(new BigDecimal(rowdetail.getDouble("discountrate"))).divide(new BigDecimal(1.13),2, BigDecimal.ROUND_HALF_UP));
  1449. insertSQL.setValue("untaxedamount", new BigDecimal(rowdetail.getDouble("qty")).multiply(new BigDecimal(rowdetail.getDouble("defaultprice"))).multiply(new BigDecimal(rowdetail.getDouble("discountrate"))).divide(new BigDecimal(1.13),2, BigDecimal.ROUND_HALF_UP));
  1450. insertSQL.setValue("skucontrol", itemRowsMap.get(rowdetail.getString("itemno")).get(0).getBoolean("skucontrol"));
  1451. j++;
  1452. sqlList.add(insertSQL.getSQL());
  1453. }
  1454. }
  1455. }
  1456. if (!sqlList.isEmpty()) {
  1457. System.err.println(sqlList.toString());
  1458. dbConnect.runSqlUpdate(sqlList);
  1459. }
  1460. } catch (Exception e1) {
  1461. e1.printStackTrace();
  1462. return getErrReturnObject().setErrMsg(e1.getMessage()).toString();
  1463. }
  1464. return getSucReturnObject().toString();
  1465. }
  1466. public CashbillEntity getCashbillEntity(BigDecimal amount, BigDecimal discountamount, Long ownerid, String source, String sourcenotes, String remarks) throws YosException {
  1467. CashbillEntity entity = new CashbillEntity();
  1468. entity.setAmount(amount);
  1469. entity.setDiscountamountamount(discountamount);
  1470. entity.setOwnerid(ownerid);
  1471. entity.setOwnertable("st_stockbill");
  1472. entity.setSource(source);
  1473. entity.setRemarks(remarks);
  1474. entity.setSourcenote(sourcenotes);
  1475. return entity;
  1476. }
  1477. /**
  1478. * @param type
  1479. * @param rb
  1480. * @param fischeck
  1481. * @return
  1482. */
  1483. public boolean isinstock(String type, String rb, boolean fischeck) {
  1484. if (type.equals("其他出库") || type.equals("销售出库")
  1485. || type.equals("生产领料出库") || type.equals("委外领料出库")
  1486. || type.equals("返修出库")) {
  1487. if ((fischeck && rb.equals("1")) || (!fischeck && rb.equals("0"))) {
  1488. return false;
  1489. } else {
  1490. return true;
  1491. }
  1492. } else if (type.equals("其他入库") || type.equals("外购入库")
  1493. || type.equals("生产入库") || type.equals("委外入库")
  1494. || type.equals("返修入库")) {
  1495. if ((fischeck && rb.equals("1")) || (!fischeck && rb.equals("0"))) {
  1496. return true;
  1497. } else {
  1498. return false;
  1499. }
  1500. }
  1501. return false;
  1502. }
  1503. /**
  1504. * @param isinstock 是否增加库存
  1505. * @param type 库存更新类型 0为默认形式。1表示生产领料更新现场仓 2表示委外领料更新现场仓
  1506. * @throws YosException
  1507. */
  1508. // public void updateIcinvbal(boolean isinstock, int type,Long st_stockbillid) throws YosException {
  1509. // ArrayList<String> sqlList =new ArrayList();
  1510. // 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 ='"
  1511. // + st_stockbillid + "' and t1.siteid='" + siteid + "'");// 出入库表体
  1512. // ArrayList<Long> itemids = new ArrayList<Long>();
  1513. // itemids = icstockbilldetail.toArrayList("itemid",new ArrayList<>());
  1514. // itemids.add((long) 0);
  1515. // int i = 0;
  1516. // String sql="select * from st_invbal where itemid in"+itemids;
  1517. // sql = sql.replace("[", "(").replace("]", ")");
  1518. // Rows invbals = dbConnect.runSqlQuery(sql);
  1519. // RowsMap invbalsRowsMap=invbals.toRowsMap("itemid");
  1520. // for(Row row : icstockbilldetail){
  1521. // String itemid = row.getString("itemid");
  1522. // //String batchno = row.getString("batchno");
  1523. // //String fdcspno = row.getString("fdcspno");
  1524. // String stockid = row.getString("stockid");
  1525. //
  1526. //// if (type == 1 && !getSysVars().getBoolean("FISBATCHFORXC")) {
  1527. //// fdcspno = "**********";
  1528. //// fbatchno = "**********";
  1529. //// fstockno = getPaoSet("TDEPARTMENT").getPao(0)
  1530. //// .getPaoSet("TSTOCKXC").getPao(0).getString("fstockno");
  1531. //// icinvbal = detailpao.getPaoSet("$icinvbal", "icinvbal",
  1532. //// "fitemno='" + fitemno + "' and fstockno='" + fstockno
  1533. //// + "' and fdcspno='" + fdcspno
  1534. //// + "' and fbatchno='" + fbatchno + "'");
  1535. //// } else if (type == 2 && !getSysVars().getBoolean("FISBATCHFORXC")) {
  1536. //// fdcspno = "**********";
  1537. //// fbatchno = "**********";
  1538. //// fstockno = getPaoSet("TSUPPLIER").getPao(0)
  1539. //// .getPaoSet("TSTOCKXC").getPao(0).getString("fstockno");
  1540. //// icinvbal = detailpao.getPaoSet("$icinvbal", "icinvbal",
  1541. //// "fitemno='" + fitemno + "' and fstockno='" + fstockno
  1542. //// + "' and fdcspno='" + fdcspno
  1543. //// + "' and fbatchno='" + fbatchno + "'");
  1544. //// }
  1545. // BigDecimal qty = isinstock ? row.getBigDecimal("qty") : row.getBigDecimal("qty").negate();
  1546. // if(!invbalsRowsMap.containsKey(itemid)){
  1547. // SQLFactory sqlFactory = new SQLFactory(this, "即时库存新增");
  1548. // sqlFactory.addParameter("st_invbalid", createTableID("st_invbal"));
  1549. // sqlFactory.addParameter("qty", qty);
  1550. // sqlFactory.addParameter("itemid", itemid);
  1551. // sqlFactory.addParameter("stockid", stockid);
  1552. // sqlFactory.addParameter("siteid",siteid);
  1553. // sqlFactory.addParameter("userid", userid);
  1554. // sqlFactory.addParameter("username", username);
  1555. // sqlList.add(sqlFactory.getSQL());
  1556. // }else{
  1557. // if(invbalsRowsMap.get(itemid).toRowsMap("stockid").containsKey(stockid)){
  1558. // SQLFactory sqlFactory = new SQLFactory(this, "即时库存更新");
  1559. // sqlFactory.addParameter("st_invbalid", createTableID("st_invbal"));
  1560. // sqlFactory.addParameter("qty", invbalsRowsMap.get(itemid).toRowsMap("stockid").get(stockid).get(0).getBigDecimal("qty").add(qty));
  1561. // sqlFactory.addParameter("itemid", itemid);
  1562. // sqlFactory.addParameter("stockid", stockid);
  1563. // sqlFactory.addParameter("siteid",siteid);
  1564. // sqlFactory.addParameter("userid", userid);
  1565. // sqlFactory.addParameter("username", username);
  1566. // sqlList.add(sqlFactory.getSQL());
  1567. // }else{
  1568. // SQLFactory sqlFactory = new SQLFactory(new Invbal(), "即时库存新增");
  1569. // sqlFactory.addParameter("st_invbalid", createTableID("st_invbal"));
  1570. // sqlFactory.addParameter("qty", qty);
  1571. // sqlFactory.addParameter("itemid", itemid);
  1572. // sqlFactory.addParameter("stockid", stockid);
  1573. // sqlFactory.addParameter("siteid",siteid);
  1574. // sqlFactory.addParameter("userid", userid);
  1575. // sqlFactory.addParameter("username", username);
  1576. // sqlList.add(sqlFactory.getSQL());
  1577. // }
  1578. // }
  1579. // }
  1580. // dbConnect.runSqlUpdate(sqlList);
  1581. // }
  1582. /**
  1583. * 账户余额冻结
  1584. *
  1585. * @param addorsub
  1586. */
  1587. public ArrayList<String> updateAccountbalance_freez(long st_stockbillid, boolean addorsub) throws YosException {
  1588. ArrayList<String> sqllist = new ArrayList<>();
  1589. /******** 冻结数据 ********/
  1590. Rows rows = dbConnect.runSqlQuery("select t4.sa_accountbalanceid,t3.sa_orderid,t3.sonum,ROUND(sum(t1.qty*t2.price*ifnull(t2.pricerate,1)*ifnull(t2.rwpricerate,1)), 2) amount from st_stockbill_items t1 \n" +
  1591. " inner join sa_orderitems t2 on t1.sa_orderitemsid=t2.sa_orderitemsid and t1.siteid=t2.siteid\n" +
  1592. " inner join sa_order t3 on t2.sa_orderid=t3.sa_orderid and t2.siteid=t3.siteid\n" +
  1593. "\t\t\t\t\t\t\t\t\tleft join sa_accountbalance t4 on t4.sa_accountclassid=t3.sa_accountclassid and t4.sys_enterpriseid=t3.sys_enterpriseid and t4.siteid=t3.siteid\n" +
  1594. " where t1.st_stockbillid=" + st_stockbillid + " group by t4.sa_accountbalanceid,t3.sa_orderid,t3.sonum");
  1595. if (addorsub) {
  1596. for (Row row : rows) {
  1597. String sonum = row.getString("sonum");
  1598. long sa_orderid = row.getLong("sa_orderid");
  1599. long sa_accountbalanceid = row.getLong("sa_accountbalanceid");
  1600. BigDecimal amount = row.getBigDecimal("amount");
  1601. Rows accountbalancefreezrows = dbConnect.runSqlQuery("select sa_accountbalance_freezid from sa_accountbalance_freez where sourceid=" + sa_orderid + " and sourcetable='sa_order' and siteid='" + siteid + "'");
  1602. sqllist.add("update sa_accountbalance set freezamount=ifnull(freezamount,0)+" + amount + " where sa_accountbalanceid=" + sa_accountbalanceid + " and siteid='" + siteid + "'");
  1603. if (accountbalancefreezrows.isNotEmpty()) {
  1604. sqllist.add("update sa_accountbalance_freez set amount=amount+" + amount + " where sa_accountbalance_freezid=" + accountbalancefreezrows.get(0).getLong("sa_accountbalance_freezid"));
  1605. } else {
  1606. long sa_accountbalance_freezid = createTableID("sa_accountbalance_freez");
  1607. InsertSQL insertSQL = SQLFactory.createInsertSQL(this, "sa_accountbalance_freez");
  1608. insertSQL.setUniqueid(sa_accountbalance_freezid);
  1609. insertSQL.setSiteid(siteid);
  1610. insertSQL.setValue("sa_accountbalanceid", sa_accountbalanceid);
  1611. insertSQL.setValue("sourcetable", "sa_order");
  1612. insertSQL.setValue("sourceid", sa_orderid);
  1613. insertSQL.setValue("amount", amount);
  1614. insertSQL.setValue("remarks", "由订单" + sonum + "审核时冻结");
  1615. insertSQL.setValue("createby", username);
  1616. insertSQL.setDateValue("createdate");
  1617. sqllist.add(insertSQL.getSQL());
  1618. }
  1619. }
  1620. } else {
  1621. for (Row row : rows) {
  1622. long sa_orderid = row.getLong("sa_orderid");
  1623. long sa_accountbalanceid = row.getLong("sa_accountbalanceid");
  1624. BigDecimal amount = row.getBigDecimal("amount");
  1625. Rows accountbalancefreezrows = dbConnect.runSqlQuery("select sa_accountbalance_freezid,amount from sa_accountbalance_freez where sourceid=" + sa_orderid + " and sourcetable='sa_order' and siteid='" + siteid + "'");
  1626. if (accountbalancefreezrows.size() > 0) {
  1627. sqllist.add("update sa_accountbalance set freezamount=ifnull(freezamount,0)-" + amount + " where sa_accountbalanceid=" + sa_accountbalanceid);
  1628. sqllist.add("update sa_accountbalance_freez set amount=amount-" + amount + " where sa_accountbalance_freezid=" + accountbalancefreezrows.get(0).getLong("sa_accountbalance_freezid"));
  1629. }
  1630. }
  1631. }
  1632. return sqllist;
  1633. }
  1634. public String[] getDistinctArray(String[] arrays) {
  1635. ArrayList<String> a = new ArrayList<String>();
  1636. for (String array : arrays) {
  1637. if (!a.contains(array)) {
  1638. a.add(array);
  1639. }
  1640. }
  1641. int size = a.size();
  1642. return (String[]) a.toArray(new String[size]);
  1643. }
  1644. public String getPeriod(boolean isjudge ,Date date) throws YosException {
  1645. String preioddate = new SimpleDateFormat("yyyy-MM-dd").format(date);
  1646. Rows rows =dbConnect.runSqlQuery("select CONCAT_WS('-', year, LPAD(month, 2, '0')) period from st_period where begdate<='"+preioddate+"' and enddate>='"+preioddate+"'");
  1647. if (rows.size() != 1) {
  1648. if(isjudge){
  1649. throw new YosException("单据日期所属会计期间未生成");
  1650. }else{
  1651. return "null";
  1652. }
  1653. } else {
  1654. return rows.get(0).getString("period");
  1655. }
  1656. }
  1657. public XSSFSheet addSheet(ExcelFactory excelFactory, String sheetname, Rows datarows,
  1658. HashMap<String, String> titlemap) {
  1659. ArrayList<String> keylist = datarows.getFieldList();
  1660. XSSFSheet sheet = excelFactory.getXssfWorkbook().createSheet(sheetname);
  1661. XSSFWorkbook xssfFWorkbook = excelFactory.getXssfWorkbook();
  1662. XSSFCellStyle xssfCellStyle1 = xssfFWorkbook.createCellStyle();
  1663. XSSFFont font = xssfFWorkbook.createFont();
  1664. font.setColor((short) 0xa);
  1665. font.setFontHeightInPoints((short) 12);
  1666. font.setBold(true);
  1667. xssfCellStyle1.setFont(font);
  1668. CellStyle style = xssfFWorkbook.createCellStyle();
  1669. DataFormat format = xssfFWorkbook.createDataFormat();
  1670. style.setDataFormat(format.getFormat("@"));
  1671. // 对单独某一列进行样式赋值,第一个参数为列数,第二个参数为样式
  1672. for (int i = 0; i <= 13; i++) {
  1673. sheet.setDefaultColumnStyle(i, style);
  1674. }
  1675. ExportExcelSpecial.setBatchDetailSheetColumn2(sheet);// 设置工作薄列宽
  1676. XSSFCellStyle titleCellStyle1 = ExportExcelSpecial.createTitleCellStyle1(xssfFWorkbook);
  1677. XSSFCellStyle titleCellStyle2 = ExportExcelSpecial.createTitleCellStyle2(xssfFWorkbook);
  1678. XSSFCellStyle titleCellStyle3 = ExportExcelSpecial.createTitleCellStyle3(xssfFWorkbook);
  1679. ExportExcelSpecial.batchDetailErr(sheet, titleCellStyle1, titleCellStyle2, titleCellStyle3, xssfFWorkbook);// 写入标题
  1680. for (int n = 0; n < datarows.size(); n++) {
  1681. Row row = datarows.get(n);
  1682. XSSFRow datarow = sheet.createRow(n + 3);
  1683. for (int i1 = 0; i1 < keylist.size(); i1++) {
  1684. Class fieldclazztype = datarows.getFieldMeta(keylist.get(i1)).getFieldtype();
  1685. if (fieldclazztype == Integer.class) {
  1686. datarow.createCell(i1).setCellValue(row.getInteger((String) keylist.get(i1)));
  1687. } else if (fieldclazztype == Long.class) {
  1688. datarow.createCell(i1).setCellValue(row.getLong((String) keylist.get(i1)));
  1689. } else if (fieldclazztype == Float.class) {
  1690. datarow.createCell(i1).setCellValue(row.getFloat((String) keylist.get(i1)));
  1691. } else if (fieldclazztype == Double.class) {
  1692. datarow.createCell(i1).setCellValue(row.getDouble((String) keylist.get(i1)));
  1693. } else {
  1694. datarow.createCell(i1).setCellValue(row.getString((String) keylist.get(i1)));
  1695. }
  1696. if (i1 == 13) {
  1697. datarow.getCell(i1).setCellStyle(xssfCellStyle1);
  1698. }
  1699. }
  1700. }
  1701. return sheet;
  1702. }
  1703. public static boolean isNumeric(String strNum) {
  1704. if (strNum == null) {
  1705. return false;
  1706. }
  1707. return strNum.matches("-?\\d+(\\.\\d+)?");
  1708. }
  1709. }