OrderImport.java 43 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846
  1. package restcontroller.webmanage.sale.order;
  2. import java.math.BigDecimal;
  3. import java.util.ArrayList;
  4. import java.util.HashMap;
  5. import common.data.*;
  6. import org.apache.commons.lang.StringUtils;
  7. import org.apache.poi.ss.usermodel.CellStyle;
  8. import org.apache.poi.ss.usermodel.CellType;
  9. import org.apache.poi.ss.usermodel.DataFormat;
  10. import org.apache.poi.xssf.usermodel.XSSFCellStyle;
  11. import org.apache.poi.xssf.usermodel.XSSFFont;
  12. import org.apache.poi.xssf.usermodel.XSSFRow;
  13. import org.apache.poi.xssf.usermodel.XSSFSheet;
  14. import org.apache.poi.xssf.usermodel.XSSFWorkbook;
  15. import com.alibaba.fastjson.JSONArray;
  16. import com.alibaba.fastjson.JSONObject;
  17. import beans.datacontrllog.DataContrlLog;
  18. import beans.itemprice.ItemPrice;
  19. import common.Controller;
  20. import common.YosException;
  21. import common.annotation.API;
  22. import common.annotation.CACHEING_CLEAN;
  23. import restcontroller.R;
  24. import restcontroller.system.attachment.Attachment;
  25. import utility.tools.Math;
  26. import static beans.order.Order.getOrderRows;
  27. public class OrderImport extends Controller {
  28. public OrderImport(JSONObject arg0) throws YosException {
  29. super(arg0);
  30. // TODO Auto-generated constructor stub
  31. }
  32. /**
  33. * 下载订单导入单模板
  34. *
  35. * @return
  36. */
  37. @API(title = "下载订单导入单模板", apiversion = R.ID20230227194703.v1.class)
  38. public String downloadOrderExcel() throws YosException {
  39. ExcelFactory excelFactory = new ExcelFactory("ImportTemplateForOrder");
  40. XSSFSheet sheet = excelFactory.getXssfWorkbook().createSheet("Sheet1");
  41. XSSFWorkbook xssfFWorkbook = excelFactory.getXssfWorkbook();
  42. CellStyle style = xssfFWorkbook.createCellStyle();
  43. // 设置为文本格式,防止身份证号变成科学计数法
  44. DataFormat format = xssfFWorkbook.createDataFormat();
  45. style.setDataFormat(format.getFormat("@"));
  46. // 对单独某一列进行样式赋值,第一个参数为列数,第二个参数为样式
  47. sheet.setDefaultColumnStyle(0, style);
  48. ExportExcel.setBatchDetailSheetColumn1(sheet);// 设置工作薄列宽
  49. XSSFCellStyle titleCellStyle1 = ExportExcel.createTitleCellStyle1(xssfFWorkbook);
  50. XSSFCellStyle titleCellStyle2 = ExportExcel.createTitleCellStyle2(xssfFWorkbook);
  51. XSSFCellStyle titleCellStyle3 = ExportExcel.createBodyCellStyle(xssfFWorkbook);
  52. XSSFCellStyle titleCellStyle4 = ExportExcel.createTitleCellStyle3(xssfFWorkbook);
  53. ExportExcel.batchDetail(sheet, titleCellStyle1, titleCellStyle2, titleCellStyle3, titleCellStyle4,
  54. xssfFWorkbook);// 写入标题
  55. Rows aa = uploadExcelToObs(excelFactory);
  56. String url = "";
  57. if (!aa.isEmpty()) {
  58. url = aa.get(0).getString("url");
  59. }
  60. return getSucReturnObject().setData(url).toString();
  61. }
  62. /**
  63. * 下载订单导入单模板
  64. *
  65. * @return
  66. */
  67. @API(title = "下载订单导入单模板", apiversion = R.ID20230308155703.v1.class)
  68. public String downloadOrderExcelSpecial() throws YosException {
  69. ExcelFactory excelFactory = new ExcelFactory("ImportTemplateForOrder");
  70. XSSFSheet sheet = excelFactory.getXssfWorkbook().createSheet("Sheet1");
  71. XSSFWorkbook xssfFWorkbook = excelFactory.getXssfWorkbook();
  72. CellStyle style = xssfFWorkbook.createCellStyle();
  73. // 设置为文本格式,防止身份证号变成科学计数法
  74. DataFormat format = xssfFWorkbook.createDataFormat();
  75. style.setDataFormat(format.getFormat("@"));
  76. // 对单独某一列进行样式赋值,第一个参数为列数,第二个参数为样式
  77. sheet.setDefaultColumnStyle(0, style);
  78. ExportExcelSpecial.setBatchDetailSheetColumn1(sheet);// 设置工作薄列宽
  79. XSSFCellStyle titleCellStyle1 = ExportExcelSpecial.createTitleCellStyle1(xssfFWorkbook);
  80. XSSFCellStyle titleCellStyle2 = ExportExcelSpecial.createTitleCellStyle2(xssfFWorkbook);
  81. XSSFCellStyle titleCellStyle3 = ExportExcelSpecial.createBodyCellStyle(xssfFWorkbook);
  82. XSSFCellStyle titleCellStyle4 = ExportExcelSpecial.createTitleCellStyle3(xssfFWorkbook);
  83. ExportExcelSpecial.batchDetail(sheet, titleCellStyle1, titleCellStyle2, titleCellStyle3, titleCellStyle4,
  84. xssfFWorkbook);// 写入标题
  85. Rows aa = uploadExcelToObs(excelFactory);
  86. String url = "";
  87. if (!aa.isEmpty()) {
  88. url = aa.get(0).getString("url");
  89. }
  90. return getSucReturnObject().setData(url).toString();
  91. }
  92. /**
  93. * 导入订单
  94. *
  95. * @return
  96. */
  97. @API(title = "导入订单明细", apiversion = R.ID20230227194803.v1.class)
  98. @CACHEING_CLEAN(apiClass = {Order.class, OrderItems.class, restcontroller.sale.order.Order.class})
  99. public String uploadOrderMxByExcel() throws YosException {
  100. long sa_orderid = content.getLongValue("sa_orderid");
  101. long sa_projectid = 0;
  102. Rows orderRows = getOrderRows(this, sa_orderid);
  103. Rows sa_orderitemsrows = dbConnect
  104. .runSqlQuery("select itemid from sa_orderitems where sa_orderid=" + sa_orderid);
  105. ArrayList<Long> itemids = sa_orderitemsrows.toArrayList("itemid", new ArrayList<>());
  106. if (orderRows.isEmpty()) {
  107. return getErrReturnObject().setErrMsg("订单不存在,无法导入明细").toString();
  108. } else {
  109. if (!orderRows.get(0).getString("status").equals("新建")) {
  110. return getErrReturnObject().setErrMsg("非新建状态下的订单无法导入明细").toString();
  111. }
  112. }
  113. long sa_contractid = orderRows.get(0).getLong("sa_contractid");
  114. sys_enterpriseid = orderRows.get(0).getLong("sys_enterpriseid");
  115. String type = orderRows.get(0).getString("type");
  116. // select t1.userid,t1.siteid,min(t2.discountrate) discountrate from sys_hr t1
  117. // inner join sa_salearea_hr t2 on t1.hrid=t2.hrid and t1.siteid=t2.siteid group
  118. // by t1.userid,t1.siteid
  119. JSONArray jsonArray = new JSONArray();
  120. jsonArray.add(content.getLong("attachmentid"));
  121. content.put("ownertable", "sa_order");
  122. content.put("ownerid", sa_orderid);
  123. content.put("usetype", "default");
  124. content.put("attachmentids", jsonArray);
  125. Attachment attachment = new Attachment(content);
  126. attachment.createFileLink();
  127. ExcelFactory e;
  128. try {
  129. // 华为云
  130. e = getPostExcelFactory(content.getLong("attachmentid"));
  131. // 本地
  132. //e = getPostExcelFactory();
  133. // Rows keyRow = dbConnect.runSqlQuery("select fagentnum,faddress from tagents
  134. // where 1=2");
  135. // Rows row1 = e.getSheetRows(1, keyRow, 1);
  136. ArrayList<String> keys = new ArrayList<>();
  137. ArrayList<String> sqllist = new ArrayList<>();
  138. keys.add("itemno");
  139. keys.add("qty");
  140. keys.add("customproperties");
  141. keys.add("length");
  142. keys.add("width");
  143. keys.add("remarks");
  144. HashMap<String, CellType> cellmap = new HashMap<>();
  145. cellmap.put("itemno", CellType.STRING);
  146. Rows rows = e.getSheetRows(0, keys, cellmap, 3);
  147. int a = 1;
  148. int i = 0;
  149. // String msg = "";
  150. boolean iserr = false;
  151. Rows rowserr = new Rows();
  152. Rows rowssuc = new Rows();
  153. for (Row row : rows) {
  154. if (StringUtils.isEmpty(row.getString("itemno")) || StringUtils.isEmpty(row.getString("qty"))) {
  155. iserr = true;
  156. row.put("msg", "错误信息:商品编号,数量不能为空");
  157. rowserr.add(row);
  158. // rows.remove(row);
  159. // msg = "手机号,省市县及来源不能为空";
  160. } else {
  161. if (sa_projectid > 0) {
  162. Rows itemsRows = dbConnect.runSqlQuery(
  163. "select t1.itemid from sa_project_items t1 inner join plm_item t2 on t1.itemid=t2.itemid and t1.siteid=t2.siteid where t1.deleted=0 and t1.sa_projectid='"
  164. + sa_projectid + "' and t2.itemno='" + row.getString("itemno")
  165. + "' and t1.siteid='" + siteid + "'");
  166. if (!itemsRows.isEmpty()) {
  167. if(!isNumeric(row.getString("qty"))){
  168. iserr = true;
  169. row.put("msg", "数量不为数字格式,请检查");
  170. rowserr.add(row);
  171. } else if(!isNumeric(row.getString("length"))){
  172. iserr = true;
  173. row.put("msg", "长度不为数字格式,请检查");
  174. rowserr.add(row);
  175. } else if(!isNumeric(row.getString("width"))){
  176. iserr = true;
  177. row.put("msg", "宽度不为数字格式,请检查");
  178. rowserr.add(row);
  179. }else if(itemsRows.get(0).getBoolean("iscustomsize") && itemsRows.get(0).getLong("pricingmetod")==1 && itemsRows.get(0).getString("spec").equals("custom")){
  180. if((StringUtils.isBlank(row.getString("length"))?0:row.getDouble("length"))==0){
  181. iserr = true;
  182. row.put("msg", "此商品必须填写长宽");
  183. rowserr.add(row);
  184. }
  185. if((StringUtils.isBlank(row.getString("width"))?0:row.getDouble("width"))==0){
  186. iserr = true;
  187. row.put("msg", "此商品必须填写长宽");
  188. rowserr.add(row);
  189. }
  190. }else{
  191. row.put("itemid", itemsRows.get(0).getString("itemid"));
  192. rowssuc.add(row);
  193. }
  194. } else {
  195. iserr = true;
  196. row.put("msg", "错误信息:该报价单所属项目中不存在商品编号为" + row.getString("itemno") + "的商品");
  197. rowserr.add(row);
  198. }
  199. } else {
  200. Rows itemsRows = dbConnect.runSqlQuery("select itemid,iscustomsize,pricingmetod,spec from plm_item where itemno='"
  201. + row.getString("itemno").trim() + "' and siteid='" + siteid + "'");
  202. if (!itemsRows.isEmpty()) {
  203. if(!isNumeric(row.getString("qty"))){
  204. iserr = true;
  205. row.put("msg", "数量不为数字格式,请检查");
  206. rowserr.add(row);
  207. } else if(!isNumeric(StringUtils.isBlank(row.getString("length"))?"0":row.getString("length"))){
  208. iserr = true;
  209. row.put("msg", "长度不为数字格式,请检查");
  210. rowserr.add(row);
  211. } else if(!isNumeric(StringUtils.isBlank(row.getString("width"))?"0":row.getString("width"))){
  212. iserr = true;
  213. row.put("msg", "宽度不为数字格式,请检查");
  214. rowserr.add(row);
  215. }else if(itemsRows.get(0).getBoolean("iscustomsize") && itemsRows.get(0).getLong("pricingmetod")==1 && itemsRows.get(0).getString("spec").equals("custom")){
  216. if((StringUtils.isBlank(row.getString("length"))?0:row.getDouble("length"))==0){
  217. iserr = true;
  218. row.put("msg", "此商品必须填写长宽");
  219. rowserr.add(row);
  220. }else if((StringUtils.isBlank(row.getString("width"))?0:row.getDouble("width"))==0){
  221. iserr = true;
  222. row.put("msg", "此商品必须填写长宽");
  223. rowserr.add(row);
  224. }else{
  225. row.put("itemid", itemsRows.get(0).getString("itemid"));
  226. rowssuc.add(row);
  227. }
  228. }else{
  229. row.put("itemid", itemsRows.get(0).getString("itemid"));
  230. rowssuc.add(row);
  231. }
  232. } else {
  233. iserr = true;
  234. row.put("msg", "错误信息:不存在商品编号为" + row.getString("itemno").trim() + "的商品");
  235. rowserr.add(row);
  236. }
  237. }
  238. }
  239. }
  240. long[] sa_orderitemsid = createTableID("sa_orderitems", rowssuc.size());
  241. if (!rowssuc.isEmpty()) {
  242. SQLFactory sqlFactoryupload = null;
  243. for (Row row : rowssuc) {
  244. BigDecimal qty = BigDecimal.valueOf(row.getDouble("qty"));
  245. if (!itemids.isEmpty()) {
  246. if (itemids.contains(row.getLong("itemid"))) {
  247. sqlFactoryupload = new SQLFactory(this, "订单商品明细_更新");
  248. Rows sa_orderitemsids = dbConnect
  249. .runSqlQuery("select sa_orderitemsid from sa_orderitems where sa_orderid="
  250. + sa_orderid + " and itemid=" + row.getLong("itemid"));
  251. sqlFactoryupload.addParameter("sa_orderitemsid",
  252. sa_orderitemsids.get(0).getLong("sa_orderitemsid"));
  253. } else {
  254. sqlFactoryupload = new SQLFactory(this, "订单商品明细_新增");
  255. sqlFactoryupload.addParameter("sa_orderitemsid", sa_orderitemsid[i]);
  256. }
  257. } else {
  258. sqlFactoryupload = new SQLFactory(this, "订单商品明细_新增");
  259. sqlFactoryupload.addParameter("sa_orderitemsid", sa_orderitemsid[i]);
  260. }
  261. sqlFactoryupload.addParameter("siteid", siteid);
  262. sqlFactoryupload.addParameter("userid", userid);
  263. sqlFactoryupload.addParameter("username", username);
  264. sqlFactoryupload.addParameter("sa_orderid", sa_orderid);
  265. sqlFactoryupload.addParameter("rowno", getRowNo(sa_orderid));
  266. sqlFactoryupload.addParameter("itemid", row.getLong("itemid"));
  267. sqlFactoryupload.addParameter("remarks", row.getString("remarks"));
  268. sqlFactoryupload.addParameter("sa_promotion_itemsid", 0);
  269. // 商品信息
  270. Row itemRow = getItemRow(row.getLong("itemid"));
  271. JSONObject item = new JSONObject();
  272. item.put("itemid", row.getString("itemid"));
  273. if(itemRow.getBoolean("iscustomsize")){
  274. item.put("length", row.getString("length"));
  275. item.put("width", row.getString("width"));
  276. sqlFactoryupload.addParameter("length", row.getDouble("length"));
  277. sqlFactoryupload.addParameter("width", row.getDouble("width"));
  278. sqlFactoryupload.addParameter("customproperties", row.getString("customproperties"));
  279. }else{
  280. item.put("length", itemRow.getString("length"));
  281. item.put("width", itemRow.getString("width"));
  282. sqlFactoryupload.addParameter("length", itemRow.getDouble("length"));
  283. sqlFactoryupload.addParameter("width", itemRow.getDouble("width"));
  284. sqlFactoryupload.addParameter("customproperties", "");
  285. }
  286. BigDecimal conversionrate = itemRow.getBigDecimal("conversionrate");
  287. if (conversionrate.compareTo(BigDecimal.ZERO) <= 0) {
  288. conversionrate = BigDecimal.valueOf(1);
  289. }
  290. sqlFactoryupload.addParameter("itemno", itemRow.getString("itemno"));
  291. sqlFactoryupload.addParameter("itemname", itemRow.getString("itemname"));
  292. sqlFactoryupload.addParameter("model", itemRow.getString("model"));
  293. sqlFactoryupload.addParameter("unit", itemRow.getString("unit"));
  294. sqlFactoryupload.addParameter("auxunit", itemRow.getString("auxunit"));
  295. sqlFactoryupload.addParameter("batchcontrol", itemRow.getLong("batchcontrol"));
  296. sqlFactoryupload.addParameter("delivery", itemRow.getLong("delivery"));
  297. sqlFactoryupload.addParameter("needdate", "null");
  298. sqlFactoryupload.addParameter("deliverydate", "null");
  299. sqlFactoryupload.addParameter("conversionrate", conversionrate);
  300. sqlFactoryupload.addParameter("stockid", 0);
  301. sqlFactoryupload.addParameter("position", 0);
  302. sqlFactoryupload.addParameter("batchno", "");
  303. sqlFactoryupload.addParameter("stockno", "");
  304. // 订购数量
  305. sqlFactoryupload.addParameter("qty", qty);
  306. // 辅助单位数量
  307. sqlFactoryupload.addParameter("auxqty", qty.divide(conversionrate));
  308. BigDecimal price;
  309. // 价格
  310. ItemPrice itemPrice = ItemPrice.getItemPrice(this, sys_enterpriseid, row.getLong("itemid"));
  311. // 判断单价是否高于系统的单价
  312. // 价格
  313. BigDecimal defaultprice;
  314. OrderItemsHelper orderItemsHelper = new OrderItemsHelper(this);
  315. //批量查询商品信息
  316. JSONObject jsonObject = new JSONObject();
  317. jsonObject.put("itemid", row.getLong("itemid"));
  318. jsonArray=new JSONArray();
  319. jsonArray.add(jsonObject);
  320. RowsMap itemRowsMap = orderItemsHelper.getItemRowsMap(jsonArray);
  321. BigDecimal saleprice = orderItemsHelper.getSalePrice(orderRows.get(0), itemPrice,item,itemRowsMap);
  322. switch (type) {
  323. case "项目订单":
  324. defaultprice = itemPrice.getContractprice(sa_contractid);
  325. break;
  326. case "工具订单":
  327. defaultprice = itemPrice.getMarketprice();
  328. break;
  329. default:
  330. if(itemRow.getBoolean("iscustomsize") && itemRow.getLong("pricingmetod")==1 && itemRow.getString("spec").equals("custom")){
  331. logger.info("price:"+itemPrice.getContractprice());
  332. logger.info("length:"+new BigDecimal(itemRow.getString("length")));
  333. logger.info("width:"+new BigDecimal(itemRow.getString("width")));
  334. defaultprice = itemPrice.getContractprice().multiply(new BigDecimal(itemRow.getString("length"))).multiply(new BigDecimal(itemRow.getString("width"))).divide(new BigDecimal("1000000"), 4, BigDecimal.ROUND_HALF_UP);
  335. }else{
  336. defaultprice = itemPrice.getContractprice();
  337. }
  338. }
  339. // 单价,折后价(元),取合同价
  340. sqlFactoryupload.addParameter("defaultprice", defaultprice);
  341. // 金额,折后金额(元)
  342. sqlFactoryupload.addParameter("defaultamount", defaultprice.multiply(qty));
  343. // 牌价、市场价(元),标准订单牌价取商品价格,项目订单取合同里的牌价
  344. sqlFactoryupload.addParameter("marketprice", itemPrice.getMarketprice());
  345. sqlFactoryupload.addParameter("price", defaultprice);
  346. // 折前金额(元)
  347. sqlFactoryupload.addParameter("amount", defaultprice.multiply(qty));
  348. sqlFactoryupload.addParameter("saleprice", saleprice);
  349. sqllist.add(sqlFactoryupload.getSQL());
  350. i++;
  351. }
  352. }
  353. if (sqllist != null && !sqllist.isEmpty()) {
  354. sqllist.add(DataContrlLog.createLog(this, "sa_order", sa_orderid, "导入", "订单明细导入成功").getSQL());
  355. dbConnect.runSqlUpdate(sqllist);
  356. // 重新排序
  357. updateRowNo(sa_orderid);
  358. new OrderItems(content).updateAccountclassinfos(sa_orderid);
  359. new OrderItemsHelper(this).executeDataFunction(sa_orderid);
  360. //生成摘要
  361. SQLFactory sqlFactory = new SQLFactory(this, "查询定制费用统计");
  362. sqlFactory.addParameter("sa_orderid", sa_orderid);
  363. Rows tempRows = dbConnect.runSqlQuery(sqlFactory);
  364. if (tempRows.isNotEmpty()) {
  365. String remarks = StringUtils.join(tempRows.toArray("remarks"), ";");
  366. dbConnect.runSqlUpdate("UPDATE sa_order set abstract ='" + remarks + "' WHERE sa_orderid='" + sa_orderid + "'");
  367. } else {
  368. dbConnect.runSqlUpdate("UPDATE sa_order set abstract ='' WHERE sa_orderid='" + sa_orderid + "'");
  369. }
  370. }
  371. if (iserr) {
  372. ExcelFactory excelFactory = new ExcelFactory("sa_ordererr");
  373. HashMap<String, String> map = new HashMap<String, String>();
  374. map.put("itemno", "商品编号");
  375. map.put("qty", "数量");
  376. map.put("customproperties", "定制信息");
  377. map.put("length", "长度");
  378. map.put("width", "宽度");
  379. map.put("remarks", "备注");
  380. map.put("msg", "错误信息");
  381. ArrayList<String> colNameList = new ArrayList<String>();
  382. HashMap<String, Class> keytypemap = new HashMap<String, Class>();
  383. colNameList.add("itemno");
  384. colNameList.add("qty");
  385. colNameList.add("customproperties");
  386. colNameList.add("length");
  387. colNameList.add("width");
  388. colNameList.add("remarks");
  389. colNameList.add("msg");
  390. keytypemap.put("itemno", String.class);
  391. keytypemap.put("qty", String.class);
  392. keytypemap.put("customproperties", String.class);
  393. keytypemap.put("length", String.class);
  394. keytypemap.put("width", String.class);
  395. keytypemap.put("remarks", String.class);
  396. keytypemap.put("msg", String.class);
  397. rowserr.setFieldList(colNameList);
  398. rowserr.setFieldTypeMap(keytypemap);
  399. addSheet(excelFactory, "Sheet1", rowserr, map);
  400. Rows aa = uploadExcelToObs(excelFactory);
  401. String url = "";
  402. if (!aa.isEmpty()) {
  403. url = aa.get(0).getString("url");
  404. }
  405. return getSucReturnObject().setData(url).toString();
  406. }
  407. } catch (Exception e1) {
  408. // TODO Auto-generated catch block
  409. // dbConnect.runSqlUpdate("delete from sa_order where sa_orderid=" +
  410. // sa_orderid);
  411. e1.printStackTrace();
  412. return getErrReturnObject().setErrMsg(e1.getMessage()).toString();
  413. }
  414. return getSucReturnObject().toString();
  415. }
  416. /**
  417. * 导入订单
  418. *
  419. * @return
  420. */
  421. @API(title = "导入订单明细", apiversion = R.ID20230308155803.v1.class)
  422. @CACHEING_CLEAN(apiClass = {Order.class, OrderItems.class, restcontroller.sale.order.Order.class})
  423. public String uploadOrderMxByExcelSpecial() throws YosException {
  424. long sa_orderid = content.getLongValue("sa_orderid");
  425. //通过版本更新订单表头数据
  426. beans.order.Order.updateOrderWithVersion(this);
  427. long sa_projectid = 0;
  428. Rows orderRows = getOrderRows(this, sa_orderid);
  429. Rows sa_orderitemsrows = dbConnect
  430. .runSqlQuery("select itemid from sa_orderitems where sa_orderid=" + sa_orderid);
  431. ArrayList<Long> itemids = sa_orderitemsrows.toArrayList("itemid", new ArrayList<>());
  432. if (orderRows.isEmpty()) {
  433. return getErrReturnObject().setErrMsg("订单不存在,无法导入明细").toString();
  434. } else {
  435. if (!orderRows.get(0).getString("status").equals("新建")) {
  436. return getErrReturnObject().setErrMsg("非新建状态下的订单无法导入明细").toString();
  437. }
  438. }
  439. long sa_contractid = orderRows.get(0).getLong("sa_contractid");
  440. sys_enterpriseid = orderRows.get(0).getLong("sys_enterpriseid");
  441. String type = orderRows.get(0).getString("type");
  442. // select t1.userid,t1.siteid,min(t2.discountrate) discountrate from sys_hr t1
  443. // inner join sa_salearea_hr t2 on t1.hrid=t2.hrid and t1.siteid=t2.siteid group
  444. // by t1.userid,t1.siteid
  445. JSONArray jsonArray = new JSONArray();
  446. jsonArray.add(content.getLong("attachmentid"));
  447. content.put("ownertable", "sa_order");
  448. content.put("ownerid", sa_orderid);
  449. content.put("usetype", "default");
  450. content.put("attachmentids", jsonArray);
  451. Attachment attachment = new Attachment(content);
  452. attachment.createFileLink();
  453. ExcelFactory e;
  454. try {
  455. // 华为云
  456. e = getPostExcelFactory(content.getLong("attachmentid"));
  457. // 本地
  458. //e = getPostExcelFactory();
  459. // Rows keyRow = dbConnect.runSqlQuery("select fagentnum,faddress from tagents
  460. // where 1=2");
  461. // Rows row1 = e.getSheetRows(1, keyRow, 1);
  462. ArrayList<String> keys = new ArrayList<>();
  463. ArrayList<String> sqllist = new ArrayList<>();
  464. keys.add("itemno");
  465. keys.add("qty");
  466. keys.add("defaultprice");
  467. Rows rows = e.getSheetRows(0, keys, 3);
  468. int a = 1;
  469. int i = 0;
  470. // String msg = "";
  471. boolean iserr = false;
  472. Rows rowserr = new Rows();
  473. Rows rowssuc = new Rows();
  474. for (Row row : rows) {
  475. if (StringUtils.isEmpty(row.getString("itemno")) || StringUtils.isEmpty(row.getString("qty")) || StringUtils.isEmpty(row.getString("defaultprice"))) {
  476. iserr = true;
  477. row.put("msg", "错误信息:商品编号,数量,折前价不能为空");
  478. rowserr.add(row);
  479. // rows.remove(row);
  480. // msg = "手机号,省市县及来源不能为空";
  481. } else {
  482. if (sa_projectid > 0) {
  483. Rows itemsRows = dbConnect.runSqlQuery(
  484. "select t1.itemid from sa_project_items t1 inner join plm_item t2 on t1.itemid=t2.itemid and t1.siteid=t2.siteid where t1.deleted=0 and t1.sa_projectid='"
  485. + sa_projectid + "' and t2.itemno='" + row.getString("itemno")
  486. + "' and t1.siteid='" + siteid + "'");
  487. if (!itemsRows.isEmpty()) {
  488. row.put("itemid", itemsRows.get(0).getString("itemid"));
  489. rowssuc.add(row);
  490. } else {
  491. iserr = true;
  492. row.put("msg", "错误信息:该报价单所属项目中不存在商品编号为" + row.getString("itemno") + "的商品");
  493. rowserr.add(row);
  494. }
  495. } else {
  496. Rows itemsRows = dbConnect.runSqlQuery("select itemid from plm_item where itemno='"
  497. + row.getString("itemno").trim() + "' and siteid='" + siteid + "'");
  498. if (!itemsRows.isEmpty()) {
  499. row.put("itemid", itemsRows.get(0).getString("itemid"));
  500. rowssuc.add(row);
  501. } else {
  502. iserr = true;
  503. row.put("msg", "错误信息:不存在商品编号为" + row.getString("itemno").trim() + "的商品");
  504. rowserr.add(row);
  505. }
  506. }
  507. }
  508. }
  509. long[] sa_orderitemsid = createTableID("sa_orderitems", rowssuc.size());
  510. if (!rowssuc.isEmpty()) {
  511. SQLFactory sqlFactoryupload = null;
  512. for (Row row : rowssuc) {
  513. BigDecimal qty = BigDecimal.valueOf(row.getDouble("qty"));
  514. BigDecimal defaultprice = BigDecimal.valueOf(row.getDouble("defaultprice"));
  515. if (!itemids.isEmpty()) {
  516. if (itemids.contains(row.getLong("itemid"))) {
  517. sqlFactoryupload = new SQLFactory(this, "订单商品明细_更新");
  518. Rows sa_orderitemsids = dbConnect
  519. .runSqlQuery("select sa_orderitemsid from sa_orderitems where sa_orderid="
  520. + sa_orderid + " and itemid=" + row.getLong("itemid"));
  521. sqlFactoryupload.addParameter("sa_orderitemsid",
  522. sa_orderitemsids.get(0).getLong("sa_orderitemsid"));
  523. } else {
  524. sqlFactoryupload = new SQLFactory(this, "订单商品明细_新增");
  525. sqlFactoryupload.addParameter("sa_orderitemsid", sa_orderitemsid[i]);
  526. }
  527. } else {
  528. sqlFactoryupload = new SQLFactory(this, "订单商品明细_新增");
  529. sqlFactoryupload.addParameter("sa_orderitemsid", sa_orderitemsid[i]);
  530. }
  531. sqlFactoryupload.addParameter("siteid", siteid);
  532. sqlFactoryupload.addParameter("userid", userid);
  533. sqlFactoryupload.addParameter("username", username);
  534. sqlFactoryupload.addParameter("sa_orderid", sa_orderid);
  535. sqlFactoryupload.addParameter("rowno", getRowNo(sa_orderid));
  536. sqlFactoryupload.addParameter("itemid", row.getLong("itemid"));
  537. sqlFactoryupload.addParameter("remarks", row.getString("remarks"));
  538. sqlFactoryupload.addParameter("customproperties", row.getString("customproperties"));
  539. sqlFactoryupload.addParameter("width", 0);
  540. sqlFactoryupload.addParameter("length", 0);
  541. sqlFactoryupload.addParameter("sa_promotion_itemsid", 0);
  542. // 商品信息
  543. Row itemRow = getItemRow(row.getLong("itemid"));
  544. BigDecimal conversionrate = itemRow.getBigDecimal("conversionrate");
  545. if (conversionrate.compareTo(BigDecimal.ZERO) <= 0) {
  546. conversionrate = BigDecimal.valueOf(1);
  547. }
  548. sqlFactoryupload.addParameter("itemno", itemRow.getString("itemno"));
  549. sqlFactoryupload.addParameter("itemname", itemRow.getString("itemname"));
  550. sqlFactoryupload.addParameter("model", itemRow.getString("model"));
  551. sqlFactoryupload.addParameter("unit", itemRow.getString("unit"));
  552. sqlFactoryupload.addParameter("auxunit", itemRow.getString("auxunit"));
  553. sqlFactoryupload.addParameter("batchcontrol", itemRow.getLong("batchcontrol"));
  554. sqlFactoryupload.addParameter("delivery", itemRow.getLong("delivery"));
  555. sqlFactoryupload.addParameter("needdate", "null");
  556. sqlFactoryupload.addParameter("deliverydate", "null");
  557. sqlFactoryupload.addParameter("conversionrate", conversionrate);
  558. sqlFactoryupload.addParameter("stockid", 0);
  559. sqlFactoryupload.addParameter("position", 0);
  560. sqlFactoryupload.addParameter("batchno", "");
  561. // 订购数量
  562. sqlFactoryupload.addParameter("qty", qty);
  563. // 辅助单位数量
  564. sqlFactoryupload.addParameter("auxqty", qty.divide(conversionrate));
  565. BigDecimal price;
  566. // 价格
  567. ItemPrice itemPrice = ItemPrice.getItemPrice(this, sys_enterpriseid, row.getLong("itemid"));
  568. // 判断单价是否高于系统的单价
  569. // 价格
  570. // switch (type) {
  571. // case "项目订单":
  572. // defaultprice = itemPrice.getContractprice(sa_contractid);
  573. // break;
  574. // case "工具订单":
  575. // defaultprice = itemPrice.getMarketprice();
  576. // break;
  577. // default:
  578. // defaultprice = itemPrice.getContractprice();
  579. // }
  580. // 单价,折后价(元),取合同价
  581. sqlFactoryupload.addParameter("defaultprice", defaultprice);
  582. // 金额,折后金额(元)
  583. sqlFactoryupload.addParameter("defaultamount", defaultprice.multiply(qty));
  584. // 牌价、市场价(元),标准订单牌价取商品价格,项目订单取合同里的牌价
  585. sqlFactoryupload.addParameter("marketprice", itemPrice.getMarketprice());
  586. sqlFactoryupload.addParameter("price", defaultprice);
  587. // 折前金额(元)
  588. sqlFactoryupload.addParameter("amount", defaultprice.multiply(qty));
  589. sqllist.add(sqlFactoryupload.getSQL());
  590. i++;
  591. }
  592. }
  593. if (sqllist != null && !sqllist.isEmpty()) {
  594. sqllist.add(DataContrlLog.createLog(this, "sa_order", sa_orderid, "导入", "订单明细导入成功").getSQL());
  595. dbConnect.runSqlUpdate(sqllist);
  596. // 重新排序
  597. updateRowNo(sa_orderid);
  598. }
  599. if (iserr) {
  600. ExcelFactory excelFactory = new ExcelFactory("sa_ordererr");
  601. HashMap<String, String> map = new HashMap<String, String>();
  602. map.put("itemno", "商品编号");
  603. map.put("qty", "数量");
  604. map.put("msg", "错误信息");
  605. ArrayList<String> colNameList = new ArrayList<String>();
  606. HashMap<String, Class> keytypemap = new HashMap<String, Class>();
  607. colNameList.add("itemno");
  608. colNameList.add("qty");
  609. colNameList.add("msg");
  610. keytypemap.put("itemno", String.class);
  611. keytypemap.put("qty", String.class);
  612. keytypemap.put("msg", String.class);
  613. rowserr.setFieldList(colNameList);
  614. rowserr.setFieldTypeMap(keytypemap);
  615. addSheet(excelFactory, "Sheet1", rowserr, map);
  616. Rows aa = uploadExcelToObs(excelFactory);
  617. String url = "";
  618. if (!aa.isEmpty()) {
  619. url = aa.get(0).getString("url");
  620. }
  621. return getSucReturnObject().setData(url).toString();
  622. }
  623. } catch (Exception e1) {
  624. // TODO Auto-generated catch block
  625. // dbConnect.runSqlUpdate("delete from sa_order where sa_orderid=" +
  626. // sa_orderid);
  627. e1.printStackTrace();
  628. return getErrReturnObject().setErrMsg(e1.getMessage()).toString();
  629. }
  630. return getSucReturnObject().toString();
  631. }
  632. public XSSFSheet addSheet(ExcelFactory excelFactory, String sheetname, Rows datarows,
  633. HashMap<String, String> titlemap) {
  634. ArrayList<String> keylist = datarows.getFieldList();
  635. XSSFSheet sheet = excelFactory.getXssfWorkbook().createSheet(sheetname);
  636. XSSFWorkbook xssfFWorkbook = excelFactory.getXssfWorkbook();
  637. XSSFCellStyle xssfCellStyle1 = xssfFWorkbook.createCellStyle();
  638. XSSFFont font = xssfFWorkbook.createFont();
  639. font.setColor((short) 0xa);
  640. font.setFontHeightInPoints((short) 12);
  641. font.setBold(true);
  642. xssfCellStyle1.setFont(font);
  643. ExportExcel.setBatchDetailSheetColumn2(sheet);// 设置工作薄列宽
  644. XSSFCellStyle titleCellStyle1 = ExportExcel.createTitleCellStyle1(xssfFWorkbook);
  645. XSSFCellStyle titleCellStyle2 = ExportExcel.createTitleCellStyle2(xssfFWorkbook);
  646. XSSFCellStyle titleCellStyle3 = ExportExcel.createTitleCellStyle3(xssfFWorkbook);
  647. ExportExcel.batchDetailErr(sheet, titleCellStyle1, titleCellStyle2, titleCellStyle3, xssfFWorkbook);// 写入标题
  648. for (int n = 0; n < datarows.size(); n++) {
  649. Row row = datarows.get(n);
  650. XSSFRow datarow = sheet.createRow(n + 3);
  651. for (int i1 = 0; i1 < keylist.size(); i1++) {
  652. Class fieldclazztype = datarows.getFieldMeta(keylist.get(i1)).getFieldtype();
  653. if (fieldclazztype == Integer.class) {
  654. datarow.createCell(i1).setCellValue(row.getInteger((String) keylist.get(i1)).intValue());
  655. } else if (fieldclazztype == Long.class) {
  656. datarow.createCell(i1).setCellValue(row.getLong((String) keylist.get(i1)));
  657. } else if (fieldclazztype == Float.class) {
  658. datarow.createCell(i1).setCellValue(row.getFloat((String) keylist.get(i1)));
  659. } else if (fieldclazztype == Double.class) {
  660. datarow.createCell(i1).setCellValue(row.getDouble((String) keylist.get(i1)));
  661. } else {
  662. datarow.createCell(i1).setCellValue(row.getString((String) keylist.get(i1)));
  663. }
  664. if (i1 == 2) {
  665. datarow.getCell(i1).setCellStyle(xssfCellStyle1);
  666. }
  667. }
  668. }
  669. return sheet;
  670. }
  671. public XSSFSheet addSheetSpecial(ExcelFactory excelFactory, String sheetname, Rows datarows,
  672. HashMap<String, String> titlemap) {
  673. ArrayList<String> keylist = datarows.getFieldList();
  674. XSSFSheet sheet = excelFactory.getXssfWorkbook().createSheet(sheetname);
  675. XSSFWorkbook xssfFWorkbook = excelFactory.getXssfWorkbook();
  676. XSSFCellStyle xssfCellStyle1 = xssfFWorkbook.createCellStyle();
  677. XSSFFont font = xssfFWorkbook.createFont();
  678. font.setColor((short) 0xa);
  679. font.setFontHeightInPoints((short) 12);
  680. font.setBold(true);
  681. xssfCellStyle1.setFont(font);
  682. ExportExcel.setBatchDetailSheetColumn2(sheet);// 设置工作薄列宽
  683. XSSFCellStyle titleCellStyle1 = ExportExcel.createTitleCellStyle1(xssfFWorkbook);
  684. XSSFCellStyle titleCellStyle2 = ExportExcel.createTitleCellStyle2(xssfFWorkbook);
  685. XSSFCellStyle titleCellStyle3 = ExportExcel.createTitleCellStyle3(xssfFWorkbook);
  686. ExportExcel.batchDetailErr(sheet, titleCellStyle1, titleCellStyle2, titleCellStyle3, xssfFWorkbook);// 写入标题
  687. for (int n = 0; n < datarows.size(); n++) {
  688. Row row = datarows.get(n);
  689. XSSFRow datarow = sheet.createRow(n + 3);
  690. for (int i1 = 0; i1 < keylist.size(); i1++) {
  691. Class fieldclazztype = datarows.getFieldMeta(keylist.get(i1)).getFieldtype();
  692. if (fieldclazztype == Integer.class) {
  693. datarow.createCell(i1).setCellValue(row.getInteger((String) keylist.get(i1)).intValue());
  694. } else if (fieldclazztype == Long.class) {
  695. datarow.createCell(i1).setCellValue(row.getLong((String) keylist.get(i1)));
  696. } else if (fieldclazztype == Float.class) {
  697. datarow.createCell(i1).setCellValue(row.getFloat((String) keylist.get(i1)));
  698. } else if (fieldclazztype == Double.class) {
  699. datarow.createCell(i1).setCellValue(row.getDouble((String) keylist.get(i1)));
  700. } else {
  701. datarow.createCell(i1).setCellValue(row.getString((String) keylist.get(i1)));
  702. }
  703. if (i1 == 3) {
  704. datarow.getCell(i1).setCellStyle(xssfCellStyle1);
  705. }
  706. }
  707. }
  708. return sheet;
  709. }
  710. /**
  711. * 获取当前订单的最大行号
  712. *
  713. * @param sa_orderid
  714. * @return
  715. * @throws YosException
  716. */
  717. public Long getRowNo(Long sa_orderid) throws YosException {
  718. Rows rows = dbConnect.runSqlQuery("SELECT COUNT(0) count from sa_orderitems WHERE sa_orderid = " + sa_orderid
  719. + " AND siteid = '" + siteid + "'");
  720. return rows.get(0).getLong("count") + 1;
  721. }
  722. /**
  723. * 重新对商品行排序
  724. *
  725. * @param sa_orderid
  726. * @throws YosException
  727. */
  728. public void updateRowNo(Long sa_orderid) throws YosException {
  729. String sql = "SELECT sa_orderitemsid from sa_orderitems WHERE sa_orderid= " + sa_orderid + " and siteid = '"
  730. + siteid + "' ORDER BY createdate ";
  731. ArrayList<Long> sa_orderitemsids = dbConnect.runSqlQuery(sql).toArrayList("sa_orderitemsid", new ArrayList<>());
  732. if (sa_orderitemsids.size() > 0) {
  733. int rowno = 1;
  734. StringBuffer where = new StringBuffer("");
  735. for (Long id : sa_orderitemsids) {
  736. where.append(" WHEN " + id + " THEN " + rowno);
  737. rowno++;
  738. }
  739. SQLFactory sqlFactory = new SQLFactory(this, "更新行号");
  740. sqlFactory.addParameter("siteid", siteid);
  741. sqlFactory.addParameter_SQL("where", where);
  742. sqlFactory.addParameter_in("sa_orderitemsid", sa_orderitemsids);
  743. sql = sqlFactory.getSQL(false);
  744. dbConnect.runSqlUpdate(sql);
  745. }
  746. }
  747. /**
  748. * 查询商品信息
  749. *
  750. * @param itemid
  751. * @return
  752. * @throws YosException
  753. */
  754. public Row getItemRow(Long itemid) throws YosException {
  755. SQLFactory sqlFactory = new SQLFactory(this, "查询商品信息");
  756. sqlFactory.addParameter("siteid", siteid);
  757. sqlFactory.addParameter("itemid", itemid);
  758. Rows rows = dbConnect.runSqlQuery(sqlFactory.getSQL(false));
  759. return rows.isNotEmpty() ? rows.get(0) : new Row();
  760. }
  761. public static boolean isNumeric(String strNum) {
  762. if (strNum == null) {
  763. return false;
  764. }
  765. return strNum.matches("-?\\d+(\\.\\d+)?");
  766. }
  767. }