NewOrderService.java 119 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302
  1. package com.caimei.modules.order.service;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.caimei.constants.UserType;
  5. import com.caimei.exception.BusinessException;
  6. import com.caimei.modules.bulkpurchase.dao.OrderInvoiceDao;
  7. import com.caimei.modules.bulkpurchase.entity.OrderInvoice;
  8. import com.caimei.modules.bulkpurchase.service.OrderInvoiceService;
  9. import com.caimei.modules.coupon.dao.CmCouponClubDao;
  10. import com.caimei.modules.coupon.dao.CmCouponDao;
  11. import com.caimei.modules.coupon.entity.CmCoupon;
  12. import com.caimei.modules.coupon.entity.CmCouponClub;
  13. import com.caimei.modules.coupon.entity.CmCouponOrderRecord;
  14. import com.caimei.modules.coupon.entity.CmCouponRedemptionCode;
  15. import com.caimei.modules.coupon.service.CmCouponService;
  16. import com.caimei.modules.miniprogram.utils.UploadPicUtils;
  17. import com.caimei.modules.order.dao.*;
  18. import com.caimei.modules.order.entity.*;
  19. import com.caimei.modules.order.utils.HttpClientUtils;
  20. import com.caimei.modules.order.utils.NewOrderStatus;
  21. import com.caimei.modules.order.utils.OrderUtil;
  22. import com.caimei.modules.order.utils.RandomCode;
  23. import com.caimei.modules.product.dao.CmPromotionDao;
  24. import com.caimei.modules.product.dao.CmSecondHandDetailDao;
  25. import com.caimei.modules.product.dao.ProductDao;
  26. import com.caimei.modules.product.entity.CmPromotion;
  27. import com.caimei.modules.product.entity.OrderProductLadderPrice;
  28. import com.caimei.modules.product.entity.Product;
  29. import com.caimei.modules.user.dao.CmUserDao;
  30. import com.caimei.modules.user.dao.NewCmClubDao;
  31. import com.caimei.modules.user.dao.NewCmShopDao;
  32. import com.caimei.modules.user.entity.*;
  33. import com.caimei.modules.user.service.CmUserBalanceRecordService;
  34. import com.caimei.modules.user.service.CmUserService;
  35. import com.caimei.modules.user.utils.ReturnedPurchaseStatus;
  36. import com.caimei.modules.user.utils.UserUtils;
  37. import com.caimei.po.CouponClub;
  38. import com.caimei.po.CouponRedemptionCode;
  39. import com.caimei.po.ProductLadderPrice;
  40. import com.caimei.po.neworder.CmShopOrder;
  41. import com.caimei.utils.*;
  42. import com.thinkgem.jeesite.common.config.Global;
  43. import com.thinkgem.jeesite.common.persistence.Page;
  44. import com.thinkgem.jeesite.common.service.CrudService;
  45. import com.thinkgem.jeesite.common.utils.DateUtils;
  46. import com.thinkgem.jeesite.common.utils.StringUtils;
  47. import com.thinkgem.jeesite.modules.sys.utils.DictUtils;
  48. import org.apache.commons.collections.CollectionUtils;
  49. import org.springframework.beans.factory.annotation.Autowired;
  50. import org.springframework.stereotype.Service;
  51. import org.springframework.transaction.annotation.Transactional;
  52. import javax.annotation.Resource;
  53. import javax.xml.bind.DatatypeConverter;
  54. import java.math.BigDecimal;
  55. import java.text.SimpleDateFormat;
  56. import java.util.*;
  57. import java.util.concurrent.atomic.AtomicReference;
  58. import java.util.regex.Matcher;
  59. import java.util.regex.Pattern;
  60. import java.util.stream.Collectors;
  61. import java.util.stream.IntStream;
  62. @Service
  63. @Transactional(readOnly = true)
  64. public class NewOrderService extends CrudService<NewOrderDao, NewOrder> {
  65. @Resource
  66. private NewOrderDao newOrderDao;
  67. @Resource
  68. private NewOrderProductDao newOrderProductDao;
  69. @Resource
  70. private OrderInvoiceService orderInvoiceService;
  71. @Resource
  72. private OrderUserInfoService orderUserInfoService;
  73. @Resource
  74. private NewShopOrderDao newShopOrderDao;
  75. @Resource
  76. private NewCmClubDao newCmClubDao;
  77. @Resource
  78. private LogisticsBatchDao logisticsBatchDao;
  79. @Resource
  80. private LogisticsRecordDao logisticsRecordDao;
  81. @Resource
  82. private LogisticsInformationDao logisticsInformationDao;
  83. @Resource
  84. private OrderInvoiceDao orderInvoiceDao;
  85. @Resource
  86. private NewOrderConfigDao newOrderConfigDao;
  87. @Resource
  88. private ProductDao productDao;
  89. @Resource
  90. private NewCmShopDao newCmShopDao;
  91. @Resource
  92. private CmUserDao cmUserDao;
  93. @Resource
  94. private CmUserService cmUserService;
  95. @Resource
  96. private CmReturnedPurchaseProductDao cmReturnedPurchaseProductDao;
  97. @Resource
  98. private CmDiscernReceiptDao cmDiscernReceiptDao;
  99. @Resource
  100. private CmUserBalanceRecordService cmUserBalanceRecordService;
  101. @Resource
  102. private CmReturnedPurchaseDao cmReturnedPurchaseDao;
  103. @Resource
  104. private CmPayShopRecordDao cmPayShopRecordDao;
  105. @Resource
  106. private CmReceiptOrderRelationDao cmReceiptOrderRelationDao;
  107. @Autowired
  108. private CmReceiptOrderRelationService cmReceiptOrderRelationService;
  109. @Autowired
  110. private CmPromotionDao cmPromotionDao;
  111. @Autowired
  112. private CmSecondHandDetailDao cmSecondHandDetailDao;
  113. @Autowired
  114. private CmCouponDao cmCouponDao;
  115. @Autowired
  116. private CmCouponService cmCouponService;
  117. @Autowired
  118. private CmCouponClubDao cmCouponClubDao;
  119. @Transactional(readOnly = false)
  120. public void updateClauseContent(NewOrder newOrder) {
  121. newOrderDao.updateClauseContent(newOrder);
  122. }
  123. @Override
  124. @Transactional(readOnly = false)
  125. public void save(NewOrder newOrder) {
  126. synchronized (NewOrderService.class) {
  127. NewOrder dbOrder = newOrderDao.findByOrderID(newOrder.getOrderID());
  128. boolean flag = false;// 是否新增标志
  129. if (newOrder.getOrderID() == null) {
  130. flag = true;
  131. newOrder.setOrderNo(OrderUtil.geneAdminOrderNo());
  132. newOrder.setSendOutStatus("1");
  133. }
  134. if (null == newOrder.getDiscountFee()) {//设置折扣
  135. newOrder.setDiscountFee(0d);
  136. }
  137. if (null == newOrder.getPromotionFullReduction()) {// 设置满减金额
  138. newOrder.setPromotionFullReduction(0d);
  139. }
  140. if (null == newOrder.getBalancePayFee()) {//设置余额
  141. newOrder.setBalancePayFee(0d);
  142. }
  143. if (newOrder.getPayFlag() == null) {//设置付款标识
  144. newOrder.setPayFlag("0");
  145. }
  146. if ("-1".equals(newOrder.getFreePostFlag())) { // 不包邮
  147. newOrder.setFreePostFlag("-1"); //`freePostFlag`'免邮标志 运费:-1到付,0包邮,1需要运费',
  148. newOrder.setFreight(-1D);//到付运费 = 0
  149. }
  150. if ("0".equals(newOrder.getFreePostFlag())) { // 包邮
  151. newOrder.setFreight(0D);//包邮运费 = 0
  152. }
  153. if (newOrder.getHasActProduct() == null) {
  154. newOrder.setHasActProduct("0");
  155. }
  156. if (newOrder.getOnlinePayFlag() == null) {
  157. newOrder.setOnlinePayFlag("0");
  158. }
  159. if (!StringUtils.equals("1", newOrder.getConfirmFlag())) {
  160. newOrder.setConfirmFlag("0");
  161. }
  162. if (newOrder.getAffirmPaymentFlag() == null) {
  163. newOrder.setAffirmPaymentFlag("0");
  164. }
  165. // 协销订单设置会所信息
  166. if (newOrder.getBpOrderUserinfo() != null && newOrder.getBpOrderUserinfo().getClubId() != null) {
  167. newOrder.setClubID(newOrder.getBpOrderUserinfo().getClubId().intValue());
  168. NewCmClub club = newCmClubDao.get(newOrder.getBpOrderUserinfo().getClubId().toString());
  169. if (null != club) {
  170. newOrder.setUserID(club.getUserID());
  171. //新增订单时设置协销Id
  172. if (flag) {
  173. if (club.getSpID() != null) {
  174. //上线的协销Id
  175. Integer spId = newCmClubDao.findSpId(club.getSpID());
  176. if (spId != null) {
  177. newOrder.setSpID(spId);
  178. } else {
  179. //设置协销为默认协销经理
  180. newOrder.setSpID(1342);
  181. }
  182. } else {
  183. //设置协销为默认协销经理
  184. newOrder.setSpID(1342);
  185. }
  186. }
  187. }
  188. }
  189. //采购中选中保存的订单商品
  190. List<NewOrderProduct> orderProducts = newOrder.getOrderProduct();
  191. double preferential = 0d;
  192. double discountFee = 0d;
  193. double productTotalFee = 0D;
  194. Set promotionsIds = new HashSet();
  195. for (NewOrderProduct o : orderProducts) {
  196. if (o.getPromotionsId() != null && o.getDiscount() >= 100d) {
  197. promotionsIds.add(o.getPromotionsId());
  198. }
  199. Double copCostPrice = getOrderProductCostPrice(o, newOrder.getUserID());
  200. o.setCostPrice(copCostPrice);
  201. //o.setShopProductAmount(copCostPrice * (o.getNum() + o.getPresentNum()));//商品费 = 成本价快照
  202. // 赠送数单独列出来
  203. o.setShopProductAmount(copCostPrice * o.getNum());
  204. discountFee += (o.getDiscountFee() == null ? 0 : o.getDiscountFee()); //主订单统计经理折扣
  205. preferential += (o.getPreferential() == null ? 0 : o.getPreferential()); //主订单统计优惠
  206. o.setCommentFlag("0");//未评论
  207. o.setUseBalanceAmount(0D);//余额
  208. o.setIsGiftProduct("0");//【旧】赠品标识
  209. Product product = productDao.get(o.getProductID() + "");
  210. o.setProductUnit(product.getUnit());
  211. o.setProductImage(AppUtils.getProductImageURL(product.getMainImage(), 0, ""));
  212. Integer shopID = o.getShopID() == null ? product.getShopID() : o.getShopID();
  213. String name = "";
  214. NewCmShop shop = newCmShopDao.get(shopID + "");
  215. if (shop != null) {
  216. name = shop.getName();
  217. }
  218. o.setShopName(name);
  219. productTotalFee += o.getPrice() * o.getNum();//商品总金额 = 商品 price * 购买数量
  220. }
  221. if (productTotalFee != 0D) {
  222. newOrder.setProductTotalFee(productTotalFee);
  223. }
  224. newOrder.setPreferential(preferential);
  225. double divDiscountFee = Math.abs(newOrder.getDiscountFee() - discountFee); //经理折扣出现误差
  226. if (newOrder.getDiscountFee() != null && Math.abs(newOrder.getDiscountFee() - discountFee) < 1) {
  227. double i = divDiscountFee / orderProducts.size();
  228. for (NewOrderProduct o : orderProducts) {
  229. o.setDiscountFee(o.getDiscountFee() + i);
  230. o.setOrderPromotionsId(null);
  231. }
  232. }
  233. newOrder.setPayStatus("1");
  234. newOrder.setZeroCostFlag(0);
  235. newOrder.setCouponAmount(newOrder.getCouponAmount() == null ? 0d : newOrder.getCouponAmount());
  236. if (flag) {
  237. // 新增
  238. newOrderDao.insert(newOrder);
  239. } else {
  240. // 修改
  241. newOrderDao.update(newOrder);
  242. }
  243. //优惠券相关
  244. CmCouponOrderRecord orderRecord = newOrderDao.findOrderCouponRecord(newOrder.getOrderID());
  245. if (orderRecord != null && newOrder.getClubCouponId() == null) {
  246. //修改订单时,不使用优惠券
  247. newOrderDao.deleteCouponOrderRecord(orderRecord.getId());
  248. }
  249. if (newOrder.getClubCouponId() != null && newOrder.getClubCouponId() > 0) {
  250. CmCoupon coupon = newOrderDao.findClubCouponById(newOrder.getClubCouponId());
  251. if (coupon != null) {
  252. if (orderRecord == null) {
  253. orderRecord = new CmCouponOrderRecord();
  254. orderRecord.setCouponAmount(coupon.getCouponAmount());
  255. orderRecord.setTouchPrice(coupon.getTouchPrice());
  256. orderRecord.setClubCouponId(newOrder.getClubCouponId());
  257. orderRecord.setOrderId(newOrder.getOrderID());
  258. orderRecord.setCreateDate(new Date());
  259. orderRecord.setCouponType(coupon.getCouponType());
  260. newOrderDao.insertCouponOrderRecord(orderRecord);
  261. } else {
  262. orderRecord.setClubCouponId(newOrder.getClubCouponId());
  263. orderRecord.setCouponAmount(coupon.getCouponAmount());
  264. orderRecord.setTouchPrice(coupon.getTouchPrice());
  265. orderRecord.setCouponType(coupon.getCouponType());
  266. newOrderDao.updateCouponOrderRecord(orderRecord);
  267. }
  268. }
  269. }
  270. // 促销订单
  271. List<CmPromotion> promotionsList = new ArrayList<>();
  272. if (promotionsIds.size() > 0) {
  273. promotionsList = newOrderDao.findPromotionsByIds(promotionsIds);
  274. newOrderDao.deleterPomotionsOrder(newOrder.getOrderID());
  275. if (promotionsList != null && promotionsList.size() > 0) {
  276. for (CmPromotion promotion : promotionsList) {
  277. Integer promotionId = Integer.parseInt(promotion.getId());
  278. promotion.setOrderId(newOrder.getOrderID());
  279. promotion.setPromotionsId(promotionId);
  280. //只针对活动满减满赠
  281. if ("2".equals(promotion.getMode()) || "3".equals(promotion.getMode())) {
  282. //凑单金额
  283. AtomicReference<BigDecimal> poolAmount = new AtomicReference<>(BigDecimal.ZERO);
  284. orderProducts.forEach(o -> {
  285. if (o.getDiscount() >= 100d) {
  286. CmPromotion cmPromotion = cmPromotionDao.findProductPromotion(o.getShopID().toString(), o.getProductID().longValue());
  287. if (cmPromotion != null && cmPromotion.getId().equals(promotion.getId())) {
  288. poolAmount.set(MathUtil.add(poolAmount, o.getTotalFee()));
  289. poolAmount.set(MathUtil.add(poolAmount, o.getTotalAddedValueTax()));
  290. }
  291. }
  292. });
  293. //判断是否达到满减满赠要求
  294. if (MathUtil.compare(poolAmount.get(), promotion.getTouchPrice()) > -1) {
  295. // 新增
  296. promotion.setId(null);
  297. newOrderDao.insertPromotionsRecord(promotion);
  298. }
  299. } else {
  300. // 新增
  301. promotion.setId(null);
  302. newOrderDao.insertPromotionsRecord(promotion);
  303. }
  304. }
  305. orderProducts.forEach(o -> {
  306. CmPromotion cmPromotion = cmPromotionDao.findProductPromotion(o.getShopID().toString(), o.getProductID().longValue());
  307. if (null != cmPromotion) {
  308. CmPromotion orderPromotions = newOrderDao.getDbPromotionsByOrderId(newOrder.getOrderID(), Integer.valueOf(cmPromotion.getId()));
  309. if (null != orderPromotions) {
  310. o.setOrderPromotionsId(Integer.valueOf(orderPromotions.getId()));
  311. }
  312. }
  313. });
  314. }
  315. }
  316. newOrder.setPromotions(promotionsList);
  317. //查询是否存在余额记录
  318. boolean isUpdateUserMoney = false;
  319. CmUserBalanceRecord balanceRecord = new CmUserBalanceRecord();
  320. balanceRecord.setOrderId(newOrder.getOrderID());
  321. List<CmUserBalanceRecord> record = cmUserBalanceRecordService.getBalanceRecord(balanceRecord);
  322. if (record != null && record.size() > 0) {
  323. record.forEach(r -> {
  324. r.setDelFlag("1");
  325. r.setRemark("修改订单,自动更新余额抵扣,此条记录作废--后台");
  326. cmUserBalanceRecordService.updateBalanceRecord(r);
  327. });
  328. // 更新用户余额
  329. cmUserDao.updateAbleUserMoney(newOrder.getBpOrderUserinfo());
  330. isUpdateUserMoney = true;
  331. }
  332. if (newOrder.getBalancePayFee() != null && newOrder.getBalancePayFee() > 0) {
  333. if (!isUpdateUserMoney) {
  334. // 更新用户余额
  335. cmUserDao.updateAbleUserMoney(newOrder.getBpOrderUserinfo());
  336. }
  337. //添加余额收支记录
  338. CmUserBalanceRecord cmUserBalanceRecord = new CmUserBalanceRecord();
  339. cmUserBalanceRecord.setUserId(newOrder.getUserID());
  340. cmUserBalanceRecord.setType("2");
  341. cmUserBalanceRecord.setBalanceType("1");
  342. cmUserBalanceRecord.setAddDate(new Date());
  343. cmUserBalanceRecord.setAmount(String.valueOf(newOrder.getBalancePayFee()));
  344. cmUserBalanceRecord.setOrderId(newOrder.getOrderID());
  345. cmUserBalanceRecord.setDelFlag("0");
  346. cmUserBalanceRecordService.insertUserBalanceRecord(cmUserBalanceRecord);
  347. }
  348. //订单客户
  349. OrderUserInfo orderUserInfo = newOrder.getBpOrderUserinfo();
  350. //发票信息
  351. OrderInvoice orderInvoice = newOrder.getOrderInvoice();
  352. orderUserInfo.setOrderId(Long.valueOf(newOrder.getOrderID()));
  353. if (null != orderInvoice) {
  354. //type '发票类型0不开发票 1普通发票 2增值税发票'
  355. orderInvoice.setOrderId(Long.valueOf(newOrder.getOrderID()));
  356. if ("2".equals(orderInvoice.getType())) {
  357. newOrder.setInvoiceFlag("1");
  358. orderInvoice.setInvoiceTitleType(null);
  359. } else if ("1".equals(orderInvoice.getType())) {
  360. orderInvoice.setRegisteredAddress(null);
  361. orderInvoice.setRegisteredPhone(null);
  362. orderInvoice.setOpenBank(null);
  363. orderInvoice.setBankAccountNo(null);
  364. newOrder.setInvoiceFlag("1");
  365. }
  366. OrderInvoice invoice = orderInvoiceDao.getWithorderId(newOrder.getOrderID().toString());
  367. orderInvoice.setInvoiceContent("明细");
  368. if (StringUtils.isNotBlank(orderInvoice.getType()) && !"0".equals(orderInvoice.getType())) {
  369. if (flag || invoice == null) {
  370. orderInvoiceService.save(orderInvoice);
  371. } else {
  372. orderInvoice.setId(invoice.getId());
  373. orderInvoiceService.updateByID(orderInvoice);
  374. }
  375. } else if (invoice != null) {
  376. orderInvoiceDao.delete(invoice);
  377. }
  378. }
  379. if ("6".equals(newOrder.getOrderSubmitType())) { // 协销帮个人下的订单
  380. orderUserInfo = orderUserInfoService.findByOrderID(newOrder.getOrderID());
  381. }
  382. orderUserInfoService.saveWithcity(orderUserInfo);
  383. //数据库中的订单商品
  384. NewOrderProduct newOrderProduct = new NewOrderProduct();
  385. newOrderProduct.setOrderID(newOrder.getOrderID());
  386. List<NewOrderProduct> dbOrderProducts = newOrderProductDao.findAllList(newOrderProduct);
  387. StringBuilder productName = new StringBuilder();
  388. if (flag) {
  389. //新增加的订单,那么删除原有的子订单 和订单商品信息
  390. newOrderProductDao.deleteByOrderID(newOrder.getOrderID());
  391. newShopOrderDao.deleteByOrderID(newOrder.getOrderID());
  392. OrderUtil.orderSplit(newOrder);
  393. // 重新生成这些子订单 和订单商品信息
  394. for (NewShopOrder shopOrder : newOrder.getNewShopOrders()) {
  395. shopOrder.setOrderID(newOrder.getOrderID());
  396. shopOrder.setOrderNo(newOrder.getOrderNo());
  397. shopOrder.setUserID(newOrder.getUserID());
  398. newShopOrderDao.insert(shopOrder);
  399. Double shopProductAmount = 0D;
  400. Double shopTaxFee = 0D;
  401. double promotionsTouchPrice = 0d;
  402. double promotionsReducedPrice = 0d;
  403. double shopTouchPrice = 0d;
  404. double shopReducedPrice = 0d;
  405. double needPayAmount = shopOrder.getNeedPayAmount();
  406. for (NewOrderProduct orderProduct : shopOrder.getNewOrderProducts()) {
  407. productName.append(orderProduct.getName());
  408. // 没有折扣时促销才生效
  409. if (orderProduct.getDiscount() >= 100d) {
  410. if (null != promotionsList && promotionsList.size() > 0) {
  411. for (CmPromotion promotion : promotionsList) {
  412. if ("3".equals(promotion.getType())) {
  413. shopOrder.setOrderPromotionsId(orderProduct.getOrderPromotionsId());
  414. if ("2".equals(promotion.getMode())) {
  415. promotionsTouchPrice = promotion.getTouchPrice();
  416. promotionsReducedPrice = promotion.getReducedPrice();
  417. shopTouchPrice += (orderProduct.getNum() * orderProduct.getPrice());
  418. }
  419. }
  420. // 单品
  421. if ("1".equals(promotion.getType())) {
  422. // 优惠价
  423. if ("1".equals(promotion.getMode())) {
  424. shopReducedPrice += (orderProduct.getPrice() - promotion.getTouchPrice()) * orderProduct.getNum();
  425. }
  426. // 单品满减
  427. if ("2".equals(promotion.getMode())) {
  428. if (orderProduct.getPrice() * orderProduct.getNum() > promotion.getTouchPrice()) {
  429. shopReducedPrice += promotion.getReducedPrice();
  430. needPayAmount -= promotion.getReducedPrice();
  431. }
  432. }
  433. }
  434. }
  435. }
  436. }
  437. orderProduct.setOrderID(newOrder.getOrderID());
  438. orderProduct.setOrderNo(newOrder.getOrderNo());
  439. orderProduct.setShopOrderID(shopOrder.getShopOrderID());
  440. orderProduct.setShopOrderNo(shopOrder.getShopOrderNo());
  441. shopTaxFee += orderProduct.getShouldPayTotalTax();
  442. shopProductAmount += orderProduct.getShopProductAmount();
  443. if (orderProduct.getLadderPriceFlag() == null) {
  444. orderProduct.setLadderPriceFlag(0);
  445. }
  446. newOrderProductDao.insert(orderProduct);
  447. //插入阶梯价格列表
  448. insertLadderPrice(orderProduct);
  449. }
  450. if (shopTouchPrice > promotionsTouchPrice) {
  451. shopReducedPrice += promotionsReducedPrice;
  452. needPayAmount -= promotionsReducedPrice;
  453. }
  454. shopOrder.setPromotionFullReduction(shopReducedPrice);
  455. shopOrder.setNeedPayAmount(needPayAmount);
  456. shopOrder.setShopProductAmount(shopProductAmount);
  457. shopOrder.setShopPostFee(0D);
  458. shopOrder.setShopTaxFee(shopTaxFee);
  459. shopOrder.setShouldPayShopAmount(shopProductAmount + shopTaxFee);
  460. shopOrder.setPayedShopAmount(0D);
  461. shopOrder.setShopOtherFee(0D);
  462. newShopOrderDao.update(shopOrder);
  463. }
  464. } else {
  465. // 重新保存逻辑
  466. //把从页面上传过来的orderProduct 根据 shopID 来分组
  467. Map<Integer, List<NewOrderProduct>> orderProductMap = new HashMap<>();
  468. for (NewOrderProduct op : newOrder.getOrderProduct()) {
  469. if (orderProductMap.containsKey(op.getShopID())) {
  470. orderProductMap.get(op.getShopID()).add(op);
  471. } else {
  472. List<NewOrderProduct> l = new ArrayList<>();
  473. l.add(op);
  474. orderProductMap.put(op.getShopID(), l);
  475. }
  476. }
  477. // orderProduct 分组完成
  478. //开始更新shopOrder
  479. List<NewShopOrder> dbShopOrders = newShopOrderDao.findListByOrderID(newOrder.getOrderID());
  480. int shopOrderNoIndex = 0; //记录子订单的最大编号 , 新添加的子订单编号一次往后增加
  481. //删除多余的shopOrder记录
  482. for (NewShopOrder s : dbShopOrders) {
  483. // 说明这个重新选择的orderProduct已经不包含这个供应商shopID的商品了
  484. if (!orderProductMap.containsKey(s.getShopID())) {
  485. newShopOrderDao.delete(s);
  486. }
  487. s.setSendOutStatus("1");
  488. int shopOrderIndex = Integer.parseInt(s.getShopOrderNo().substring(s.getShopOrderNo().length() - 2));
  489. shopOrderNoIndex = shopOrderNoIndex < shopOrderIndex ? shopOrderIndex : shopOrderNoIndex;
  490. }
  491. //更新其余的shopOrder的信息
  492. A:
  493. for (Map.Entry<Integer, List<NewOrderProduct>> entry : orderProductMap.entrySet()) {
  494. for (NewShopOrder s : dbShopOrders) {
  495. if (s.getShopID().intValue() == entry.getKey().intValue()) {
  496. OrderUtil.updateShopOrderInfo(s, entry.getValue(), newOrder.getPromotions());
  497. newShopOrderDao.update(s);
  498. continue A;
  499. }
  500. }
  501. NewShopOrder newShopOrder = new NewShopOrder();
  502. OrderUtil.updateShopOrderInfo(newShopOrder, entry.getValue(), newOrder.getPromotions());
  503. newShopOrder.setShopOrderNo(OrderUtil.getshopOrderNo(newOrder.getOrderNo(), ++shopOrderNoIndex));
  504. newShopOrder.setSendOutStatus("1");
  505. newShopOrder.setOrderNo(newOrder.getOrderNo());
  506. newShopOrder.setOrderID(newOrder.getOrderID());
  507. newShopOrder.setUserID(newOrder.getUserID());
  508. newShopOrder.setOrderSubmitType(Integer.parseInt(dbOrder.getOrderSubmitType()));
  509. newShopOrder.setOrderTime(dbOrder.getOrderTime());
  510. newShopOrder.setSpID(dbOrder.getSpID());
  511. newShopOrder.setMainSpID(dbOrder.getMainSpID());
  512. newShopOrder.setAutoOverTimeMills(0L);
  513. newShopOrder.setAutoReceiveTimeMills(0L);
  514. newShopOrder.setClubID(newOrder.getClubID());
  515. newShopOrder.setCanRefundAmount(0D);
  516. newShopOrder.setRefundAmount(0D);
  517. newShopOrder.setRefundStatus(0);
  518. newShopOrder.setOrderBeanAmount(0);
  519. newShopOrder.setUseBeanFlag(0);
  520. newShopOrder.setUseBeanAmount(0);
  521. newShopOrder.setStatus(1);//子订单待确认
  522. newShopOrder.setAccountAmount(0D);
  523. newShopOrder.setCanRefundFlag(1);
  524. newShopOrder.setBuyStatus("1");
  525. newShopOrder.setPayStatus("1");
  526. if ("0".equals(newOrder.getFreePostFlag())) {
  527. newShopOrder.setFee(0D);//运费
  528. }
  529. if ("-1".equals(newOrder.getFreePostFlag())) {
  530. newShopOrder.setFee(-1D);//运费
  531. }
  532. newShopOrder.setOutStoreNum(0);
  533. newShopOrder.setDelFlag("0");
  534. newShopOrder.setPayFlag("0");
  535. newShopOrder.setSplitFlag("1");// 订单默认可拆分
  536. newShopOrderDao.insert(newShopOrder);
  537. for (NewOrderProduct product : orderProducts) {
  538. if (product.getShopID().intValue() == newShopOrder.getShopID().intValue()) {
  539. product.setShopOrderID(newShopOrder.getShopOrderID());
  540. product.setShopOrderNo(newShopOrder.getShopOrderNo());
  541. product.setOrderPromotionsId(product.getOrderPromotionsId());
  542. }
  543. }
  544. }
  545. List<NewShopOrder> shopOrders = newShopOrderDao.findListByOrderID(newOrder.getOrderID());
  546. Map<Integer, Integer> dbShopInfoID = new HashMap<>(); //用来存放数据库中这个订单原来的子订单中 供应商的信息 key = shopID value = shopOrderNo
  547. Map<Integer, String> dbShopInfoNo = new HashMap<>(); //用来存放数据库中这个订单原来的子订单中 供应商的信息 key = shopID value = shopOrderID
  548. for (NewShopOrder so : shopOrders) {
  549. dbShopInfoID.put(so.getShopID(), so.getShopOrderID());
  550. dbShopInfoNo.put(so.getShopID(), so.getShopOrderNo());
  551. }
  552. if (CollectionUtils.isNotEmpty(orderProducts)) {
  553. loop:
  554. for (NewOrderProduct product : orderProducts) {
  555. if (product.getOrderProductID() != null) { //修改:表单所有ID不为空的修改
  556. if (CollectionUtils.isNotEmpty(dbOrderProducts)) {
  557. for (NewOrderProduct dbProduct : dbOrderProducts) {
  558. if (dbProduct.getProductID().intValue() == product.getProductID().intValue() && product.getProductType().equals(dbProduct.getProductType())) {
  559. product.setOrderID(newOrder.getOrderID());
  560. Double copCostPrice = getOrderProductCostPrice(product, newOrder.getUserID());
  561. product.setCostPrice(copCostPrice);
  562. // product.setShopProductAmount(copCostPrice * (product.getNum() + product.getPresentNum()));//商品费 = 成本价快照
  563. // 赠送数单独列出来
  564. product.setShopProductAmount(copCostPrice * product.getNum());
  565. newOrderProductDao.update(product);
  566. //更新订单商品阶梯价格
  567. updateLadderPrice(product);
  568. }
  569. }
  570. }
  571. } else { // 表单订单商品ID为空 可能是新增 但是 增加的是同样的商品的话 会覆盖原来的商品 也相当于是 修改
  572. // 可能存在一种情况 就是原来存在的商品 又被重新添加了一次
  573. // 这时,页面传过来的商品的 product.getOrderProductID() == null
  574. // 所以 不能直接通过 product.getOrderProductID() == null 条件来决定是否insert
  575. // 还需要对比一下productID
  576. if (CollectionUtils.isNotEmpty(dbOrderProducts)) {
  577. for (NewOrderProduct dbProduct : dbOrderProducts) {
  578. if (dbProduct.getProductID().intValue() == product.getProductID().intValue() && product.getProductType().equals(dbProduct.getProductType())) {
  579. product.setOrderID(newOrder.getOrderID());
  580. product.setOrderNo(dbProduct.getOrderNo());
  581. product.setShopOrderID(dbProduct.getShopOrderID());
  582. product.setShopOrderNo(dbProduct.getShopOrderNo());
  583. product.setOrderProductID(dbProduct.getOrderProductID());
  584. Double copCostPrice = getOrderProductCostPrice(dbProduct, newOrder.getUserID());
  585. product.setCostPrice(copCostPrice);
  586. product.setLadderPriceFlag(product.getLadderPriceFlag() == null ? dbProduct.getLadderPriceFlag() : product.getLadderPriceFlag());
  587. product.setIsActProduct(product.getIsActProduct() == null ? dbProduct.getIsActProduct() : product.getIsActProduct());
  588. product.setIncludedTax(product.getIncludedTax() == null ? dbProduct.getIncludedTax() : product.getIncludedTax());
  589. product.setInvoiceType(product.getInvoiceType() == null ? dbProduct.getInvoiceType() : product.getInvoiceType());
  590. // product.setShopProductAmount(copCostPrice * (product.getNum() + product.getPresentNum()));//商品费 = 成本价快照
  591. // 赠送数单独列出来
  592. product.setShopProductAmount(copCostPrice * product.getNum());
  593. newOrderProductDao.update(product);
  594. //更新订单商品阶梯价格
  595. updateLadderPrice(product);
  596. continue loop;
  597. }
  598. }
  599. }
  600. product.setOrderNo(newOrder.getOrderNo());
  601. product.setOrderID(newOrder.getOrderID());
  602. if (dbShopInfoID.containsKey(product.getShopID())) {
  603. //数据库子订单中包含了这个供应商 就不需要添加子订单
  604. product.setShopOrderID(dbShopInfoID.get(product.getShopID()));
  605. product.setShopOrderNo(dbShopInfoNo.get(product.getShopID()));
  606. }
  607. if (product.getLadderPriceFlag() == null) {
  608. product.setLadderPriceFlag(0);
  609. }
  610. newOrderProductDao.insert(product);
  611. //插入阶梯价格列表
  612. insertLadderPrice(product);
  613. }
  614. }
  615. }
  616. //删除
  617. if (CollectionUtils.isNotEmpty(orderProducts)) {
  618. for (NewOrderProduct dbProduct : dbOrderProducts) {
  619. boolean b = true;//删除
  620. for (NewOrderProduct product : orderProducts) {
  621. if (dbProduct.getProductID().intValue() == product.getProductID().intValue() && product.getProductType().equals(dbProduct.getProductType())) {
  622. b = false;//不删除
  623. break;
  624. }
  625. }
  626. //删除:数据库有,表单没有的
  627. if (b) {
  628. dbProduct.setDelFlag(DateUtils.formatDate(new Date(), "yyyyMMddHHmmssSSSS"));
  629. newOrderProductDao.delete(dbProduct);
  630. }
  631. }
  632. }
  633. }
  634. //如果不包邮 增加运费商品子订单(先删除掉相关订单和订单商品)运费商品ID 999
  635. Integer freightProductID = 999;
  636. NewShopOrder freightShopOrder = new NewShopOrder();
  637. NewOrderProduct freightOrderProduct = new NewOrderProduct();
  638. //根据主订单号和运费商品查出订单商品
  639. List<NewOrderProduct> freightOrderProductList = newOrderProductDao.findFreightOrderProductList(newOrder.getOrderID(), freightProductID);
  640. if (newOrder.getShopNote() != null) {
  641. List<NewShopOrder> so = newShopOrderDao.findListByOrderID(newOrder.getOrderID());
  642. Arrays.asList(newOrder.getShopNote()).stream().forEach(note -> {
  643. if (StringUtils.isNoneEmpty(note) && note.contains("=")) {
  644. String shopID = note.split("=")[1];
  645. String text = note.split("=")[0];
  646. if (StringUtils.isNotEmpty(shopID)) {
  647. NewShopOrder shopOrder = so.stream().filter(sOrder -> sOrder.getShopID().intValue() == Integer.valueOf(shopID)).findAny().get();
  648. shopOrder.setNote(text);
  649. newShopOrderDao.updateNote(shopOrder);
  650. }
  651. }
  652. });
  653. }
  654. for (NewOrderProduct bean : freightOrderProductList) {
  655. freightShopOrder.setShopOrderID(bean.getShopOrderID());
  656. freightOrderProduct.setOrderProductID(bean.getOrderProductID());
  657. newShopOrderDao.delete(freightShopOrder);
  658. newOrderProductDao.delete(freightOrderProduct);
  659. }
  660. if (newOrder.getFreePostFlag() != null && newOrder.getFreePostFlag().equals("1")) {
  661. setFreightShopOrder(newOrder);
  662. }
  663. List<NewShopOrder> shopOrders = newShopOrderDao.findListByOrderID(newOrder.getOrderID());
  664. String shopOrderIDs = "";
  665. for (int i = 0; i < shopOrders.size(); i++) {
  666. if (i == shopOrders.size() - 1) {
  667. shopOrderIDs = shopOrderIDs + shopOrders.get(i).getShopOrderID();
  668. } else {
  669. shopOrderIDs = shopOrderIDs + shopOrders.get(i).getShopOrderID() + ",";
  670. }
  671. }
  672. newOrder.setShopOrderIDs(shopOrderIDs);
  673. newOrderDao.update(newOrder);
  674. //下单短信推送
  675. /**
  676. * 后台下单不推送短信
  677. */
  678. /*try {
  679. if (flag && "0".equals(newOrder.getRebateFlag())) {
  680. CmUser user = cmUserDao.get(newOrder.getUserID().toString());
  681. if (user != null && StringUtils.isNotBlank(user.getBindMobile())) {
  682. String wwwServer = Global.getConfig("wwwServer");
  683. String shortLink = getShortLink(8, 3, wwwServer + "user/order/detail.html?orderId=" + newOrder.getOrderID());
  684. String name = productName.toString();
  685. if (name.length() > 10) {
  686. name = name.substring(0, 10);
  687. }
  688. String content = "您已成功下单“" + name + "...”等" + newOrder.getProductCount() + "件商品,订单编号:" + newOrder.getOrderNo() + ",订单等待支付,支付完成后采美将尽快安排发货。" +
  689. "您可关注采美公众号或者访问采美微信小程序和网站查看并支付订单。平台公众号:微信搜索“采美365网”; 微信小程序:微信搜索“采美采购商城”;网址:www.caimei365.com/t/" + shortLink;
  690. boolean sendSms = getSendSms(3, user.getBindMobile(), content);
  691. if (!sendSms) {
  692. logger.info("下单推送失败,orderId>>>>" + newOrder.getOrderID());
  693. }
  694. }
  695. }
  696. } catch (Exception e) {
  697. e.printStackTrace();
  698. }*/
  699. }
  700. }
  701. public String getShortLink(int length, int markId, String url) {
  702. String shortLink = RandomCode.generateShortLink(length);
  703. Integer id = newOrderDao.findBYShortLink(shortLink);
  704. if (id != null && id > 0) {
  705. getShortLink(length, markId, url);
  706. }
  707. newOrderDao.insertShortLink(markId, shortLink, url);
  708. return shortLink;
  709. }
  710. public boolean getSendSms(int markId, String mobile, String content) throws Exception {
  711. String config = Global.getConfig("cm.config");
  712. //测试环境手机号允许发短信
  713. List<String> list = new ArrayList<>();
  714. list.add("15917362709");
  715. list.add("15814011616");
  716. list.add("13100721916");
  717. list.add("15113936829");
  718. if (config.equals("product") || list.contains(mobile)) {
  719. if (StringUtils.isNotBlank(mobile) && mobile.length() == 11) {
  720. String regex = "^(1[3-9]\\d{9}$)";
  721. Pattern pattern = Pattern.compile(regex);
  722. Matcher matcher = pattern.matcher(mobile);
  723. if (matcher.matches()) {
  724. Map<String, Object> map = new HashMap<>(2);
  725. map.put("content", content);
  726. map.put("mobile", mobile);
  727. String coreServer = Global.getConfig("caimei.core");
  728. String url = coreServer + "/tools/sms/send";
  729. String result = HttpRequest.sendPost(url, map);
  730. JSONObject parseObject = JSONObject.parseObject(result);
  731. Integer code = parseObject.getInteger("code");
  732. if (code != 0) {
  733. logger.info("短信发送失败,手机号>>>>" + mobile);
  734. } else {
  735. newOrderDao.updateSendNum(markId, 1);
  736. return true;
  737. }
  738. }
  739. }
  740. }
  741. return false;
  742. }
  743. private void insertLadderPrice(NewOrderProduct orderProduct) {
  744. List<OrderProductLadderPrice> orderProductLadderPriceList = new ArrayList<>();
  745. if (orderProduct.getLadderPriceFlag() == 1) {
  746. //使用阶梯价格的订单商品保存下单时的阶梯价格列表
  747. List<ProductLadderPrice> ladderPriceList = productDao.findProductLadderPrice(orderProduct.getProductID(), 3);
  748. ladderPriceList.forEach(ladderPrice -> {
  749. OrderProductLadderPrice orderProductLadderPrice = new OrderProductLadderPrice();
  750. orderProductLadderPrice.setOrderProductId(orderProduct.getOrderProductID());
  751. orderProductLadderPrice.setBuyNum(ladderPrice.getBuyNum());
  752. orderProductLadderPrice.setBuyPrice(new BigDecimal(ladderPrice.getBuyPrice()));
  753. orderProductLadderPrice.setCreateDate(new Date());
  754. orderProductLadderPrice.setLadderNum(ladderPrice.getLadderNum().intValue());
  755. orderProductLadderPriceList.add(orderProductLadderPrice);
  756. });
  757. }
  758. if (!CollectionUtils.isEmpty(orderProductLadderPriceList)) {
  759. orderProductLadderPriceList.forEach(ladderPrice -> {
  760. newOrderProductDao.insertOrderProductLadderPrice(ladderPrice);
  761. });
  762. }
  763. }
  764. private void updateLadderPrice(NewOrderProduct product) {
  765. if (product.getLadderPriceFlag() == 1) {
  766. List<ProductLadderPrice> ladderPriceList = productDao.findProductLadderPrice(product.getProductID(), 3);
  767. List<OrderProductLadderPrice> orderProductLadderPriceList = newOrderProductDao.findladderPriceList(product.getOrderProductID());
  768. AtomicReference<Boolean> equalsFlag = new AtomicReference<>(true);
  769. //判断新的阶梯价格列表和订单商品的阶梯价格列表是否相同
  770. if (ladderPriceList.size() == orderProductLadderPriceList.size()) {
  771. ladderPriceList.forEach(ladderPrice -> {
  772. orderProductLadderPriceList.forEach(orderProductLadderPrice -> {
  773. if (ladderPrice.getLadderNum().equals(orderProductLadderPrice.getLadderNum())) {
  774. if (!ladderPrice.getBuyNum().equals(orderProductLadderPrice.getBuyNum()) || ladderPrice.getBuyPrice() != orderProductLadderPrice.getBuyPrice().doubleValue()) {
  775. equalsFlag.set(false);
  776. }
  777. }
  778. });
  779. });
  780. }
  781. if (!equalsFlag.get()) {
  782. //若不相同,则更新订单商品表的阶梯价格列表
  783. newOrderProductDao.deleteLadderPrice(product.getOrderProductID());
  784. List<OrderProductLadderPrice> newLadderPriceList = new ArrayList<>();
  785. ladderPriceList.forEach(ladderPrice -> {
  786. OrderProductLadderPrice orderProductLadderPrice = new OrderProductLadderPrice();
  787. orderProductLadderPrice.setOrderProductId(product.getOrderProductID());
  788. orderProductLadderPrice.setBuyNum(ladderPrice.getBuyNum());
  789. orderProductLadderPrice.setBuyPrice(new BigDecimal(ladderPrice.getBuyPrice()));
  790. orderProductLadderPrice.setCreateDate(new Date());
  791. orderProductLadderPrice.setLadderNum(ladderPrice.getLadderNum().intValue());
  792. newLadderPriceList.add(orderProductLadderPrice);
  793. });
  794. if (!CollectionUtils.isEmpty(newLadderPriceList)) {
  795. newLadderPriceList.forEach(ladderPrice -> {
  796. newOrderProductDao.insertOrderProductLadderPrice(ladderPrice);
  797. });
  798. }
  799. }
  800. }
  801. }
  802. /***
  803. * 获取成本价
  804. * @param o 订单商品
  805. * @return
  806. */
  807. public double getOrderProductCostPrice(NewOrderProduct o, Integer userID) {
  808. //获取产品表的成本
  809. Product product = productDao.get(String.valueOf(o.getProductID()));
  810. Float costPrice = 0.0f;//成本价
  811. //判断是否选中固定成本价
  812. if (null != product.getCostPrice() && org.apache.commons.lang3.StringUtils.equals("1", product.getCostCheckFlag()) && StringUtils.isNotEmpty(product.getCostPrice())) {
  813. String costPriceStr = product.getCostPrice();
  814. if (StringUtils.isNotEmpty(costPriceStr)) {
  815. costPrice = Float.parseFloat(costPriceStr);
  816. }
  817. }
  818. //判断是否选中比例成本价
  819. else if (null != product.getCostProportional() && org.apache.commons.lang3.StringUtils.equals("2", product.getCostCheckFlag()) && StringUtils.isNotEmpty(product.getCostProportional())) {
  820. double price = o.getDiscountPrice();
  821. if (userID != null) {
  822. CmUser cmUser = cmUserDao.get(userID.toString());
  823. if ("3".equals(cmUser.getRegisterUserTypeID()) ||
  824. "23".equals(cmUser.getRegisterUserTypeID()) ||
  825. "33".equals(cmUser.getRegisterUserTypeID())) {
  826. price = o.getDiscountPrice(); //会员价
  827. }
  828. }
  829. if (o.getProductType() == 1 || o.getProductType() == 2) {
  830. // 赠品订单过来售价为0,去数据库获取该商品原始售价
  831. Double tempPrice = cmPromotionDao.getPresentPriceById(o.getProductID());
  832. if (null != tempPrice && tempPrice > 0) {
  833. price = tempPrice;
  834. }
  835. }
  836. CmPromotion promotions = cmPromotionDao.findPromotionsByProductId(o.getProductID());
  837. //不含税可开票/未知商品计算税费
  838. if (("0".equals(product.getIncludedTax()) && ("1".equals(product.getInvoiceType()) || "2".equals(product.getInvoiceType()))) || "2".equals(product.getIncludedTax()) || "".equals(product.getIncludedTax())) {
  839. BigDecimal addedValueTax = BigDecimal.ZERO;
  840. if (promotions != null && "1".equals(promotions.getType()) && "1".equals(promotions.getMode())) {
  841. addedValueTax = MathUtil.div(MathUtil.mul(promotions.getTouchPrice(), o.getTaxRate()), BigDecimal.valueOf(100));
  842. price = MathUtil.add(promotions.getTouchPrice(), addedValueTax).doubleValue();
  843. } else {
  844. addedValueTax = MathUtil.div(MathUtil.mul(price, o.getTaxRate()), BigDecimal.valueOf(100));
  845. price = MathUtil.add(price, addedValueTax).doubleValue();
  846. }
  847. } else if (promotions != null && "1".equals(promotions.getType()) && "1".equals(promotions.getMode())) {
  848. price = promotions.getTouchPrice();
  849. }
  850. //通过比例成本价计算
  851. costPrice = MathUtil.mul(MathUtil.div(product.getCostProportional(), 100), price).floatValue();
  852. //赠品重新计算供应商税费
  853. if ((o.getProductType() == 1 || o.getProductType() == 2)
  854. && o.getSupplierTaxRate() != null && o.getSupplierTaxRate() > 0
  855. && (("0".equals(product.getIncludedTax()) && ("1".equals(product.getInvoiceType()) || "2".equals(product.getInvoiceType())))
  856. || "2".equals(product.getIncludedTax()) || "".equals(product.getIncludedTax()))) {
  857. Double singleShouldPayTotalTax = (costPrice * o.getSupplierTaxRate()) / 100;
  858. o.setSingleShouldPayTotalTax(singleShouldPayTotalTax);
  859. o.setShouldPayTotalTax(singleShouldPayTotalTax * o.getNum());
  860. }
  861. }
  862. return costPrice;
  863. }
  864. /**
  865. * @return
  866. * @Author ye.qin
  867. * @Description //TODO 设置运费子订单
  868. * @Date 2019\5\23 0023 18:11
  869. * @Param
  870. */
  871. private void setFreightShopOrder(NewOrder newOrder) {
  872. NewOrder pOrder = newOrder;
  873. Product product = productDao.get(Global.getConfig("freightProductID"));
  874. newOrder = newOrderDao.get(newOrder.getOrderID().toString());
  875. NewShopOrder newShopOrder = new NewShopOrder();
  876. int i = newShopOrderDao.findShopOrderNum(newOrder.getOrderID()) + 1;
  877. newShopOrder.setShopOrderNo(OrderUtil.getshopOrderNo(newOrder.getOrderNo(), i));
  878. newShopOrder.setOrderNo(newOrder.getOrderNo());
  879. newShopOrder.setOrderID(newOrder.getOrderID());
  880. newShopOrder.setUserID(newOrder.getUserID());
  881. newShopOrder.setOrderType(Integer.valueOf(newOrder.getOrderType()));
  882. newShopOrder.setOrderSubmitType(Integer.valueOf(newOrder.getOrderSubmitType()));
  883. newShopOrder.setPresentNum(0);
  884. newShopOrder.setItemCount(1);
  885. newShopOrder.setShopID(product.getShopID()); //运费商品供应商ID默认998
  886. newShopOrder.setFee(newOrder.getFreight());
  887. newShopOrder.setProductAmount(newOrder.getFreight());
  888. newShopOrder.setTotalAmount(newOrder.getFreight());
  889. newShopOrder.setNeedPayAmount(newOrder.getFreight());
  890. newShopOrder.setDiscountAmount(0D);
  891. if ("1".equals(pOrder.getPostageOrderFlag())) {
  892. newShopOrder.setPayFlag("1");
  893. newShopOrder.setPayStatus("3");
  894. } else {
  895. newShopOrder.setPayFlag("0");
  896. newShopOrder.setPayStatus("1");
  897. }
  898. newShopOrder.setOrderTime(newOrder.getOrderTime());
  899. newShopOrder.setSendOutStatus("3");
  900. newShopOrder.setTotalAddedValueTax(0D);
  901. newShopOrder.setCanRefundAmount(0D);
  902. newShopOrder.setOutStoreNum(1);
  903. newShopOrder.setRefundAmount(0D);
  904. newShopOrder.setRefundStatus(0);
  905. newShopOrder.setClubID(newOrder.getClubID());
  906. newShopOrder.setSpID(newOrder.getSpID());
  907. newShopOrder.setMainSpID(newOrder.getMainSpID());
  908. newShopOrder.setAutoOverTimeMills(0L);
  909. newShopOrder.setAutoReceiveTimeMills(0L);
  910. newShopOrder.setOrderBeanAmount(0);
  911. newShopOrder.setUseBeanFlag(0);
  912. newShopOrder.setUseBeanAmount(0);
  913. newShopOrder.setAccountAmount(0D);
  914. newShopOrder.setCanRefundFlag(1);
  915. newShopOrder.setBuyStatus("1");
  916. newShopOrder.setDelFlag("0");
  917. newShopOrder.setPayFlag("0");
  918. newShopOrder.setSplitFlag("1");// 订单默认可拆分
  919. newShopOrder.setZeroCostFlag(0);// 子订单0成本标识
  920. newShopOrderDao.insert(newShopOrder);
  921. //插入订单商品
  922. NewOrderProduct orderProduct = new NewOrderProduct();
  923. orderProduct.setOrderNo(newOrder.getOrderNo());
  924. orderProduct.setOrderID(newOrder.getOrderID());
  925. orderProduct.setShopOrderID(newShopOrder.getShopOrderID());
  926. orderProduct.setShopOrderNo(newShopOrder.getShopOrderNo());
  927. orderProduct.setShopID(product.getShopID());
  928. orderProduct.setProductID(999);
  929. orderProduct.setNum(1);
  930. orderProduct.setPresentNum(0);
  931. orderProduct.setOutStoreType("0");
  932. orderProduct.setProps(product.getProps());
  933. orderProduct.setProductNo(product.getProductCode());
  934. orderProduct.setPrice(newOrder.getFreight());
  935. orderProduct.setNormalPrice(newOrder.getFreight());
  936. orderProduct.setPrice0(newOrder.getFreight());
  937. orderProduct.setPrice1(newOrder.getFreight());
  938. orderProduct.setTotalAmount(newOrder.getFreight());
  939. orderProduct.setTotalFee(newOrder.getFreight());
  940. orderProduct.setShouldPayFee(newOrder.getFreight());
  941. orderProduct.setDiscount(100D);
  942. orderProduct.setDiscountPrice(newOrder.getFreight());
  943. orderProduct.setTaxRate(0D);
  944. orderProduct.setAddedValueTax(0D);
  945. orderProduct.setTotalAddedValueTax(0D);
  946. orderProduct.setShouldPayTotalTax(0D);
  947. orderProduct.setShopFee(0D);
  948. orderProduct.setOtherFee(0D);
  949. orderProduct.setCmFee(newOrder.getFreight());
  950. orderProduct.setSingleShopFee(0D);
  951. orderProduct.setSingleOtherFee(0D);
  952. orderProduct.setSingleCmFee(newOrder.getFreight());
  953. orderProduct.setTotalBeans(0D);
  954. orderProduct.setUseBalanceAmount(0D);
  955. orderProduct.setUseBeanAmount(0);
  956. orderProduct.setNotOutStore(0);
  957. orderProduct.setCmbeanPrice(0);
  958. orderProduct.setBuyAgainFlag("0");
  959. orderProduct.setShopName(product.getShopName());
  960. orderProduct.setName(product.getName());
  961. orderProduct.setCostPrice(newOrder.getFreight());
  962. orderProduct.setLadderPriceFlag(0);
  963. orderProduct.setIncludedTax(product.getIncludedTax());
  964. orderProduct.setInvoiceType(product.getInvoiceType());
  965. newOrderProductDao.insert(orderProduct);
  966. }
  967. @Override
  968. public NewOrder get(String id) {
  969. NewOrder newOrder = super.get(id);
  970. CmUser user = cmUserDao.get(newOrder.getUserID().toString());
  971. if (user != null) {
  972. //查询用户余额,机构名
  973. newOrder.setBuyer(user.getName());
  974. Double ableUserMoney = user.getAbleUserMoney() == null ? 0d : user.getAbleUserMoney();
  975. newOrder.setAbleUserMoney(ableUserMoney);
  976. }
  977. List<Integer> l = new ArrayList<>();
  978. l.add(newOrder.getOrderID());
  979. List<Integer> orderIds = cmDiscernReceiptDao.findRebateOrderID(l);
  980. if (orderIds.contains(newOrder.getOrderID()))
  981. newOrder.setRebateOrder("1");
  982. else
  983. newOrder.setRebateOrder("0");
  984. if (null != newOrder) {
  985. if (newOrder.getCouponAmount() > 0) {
  986. CmCouponOrderRecord couponRecord = newOrderDao.findOrderCouponRecord(newOrder.getOrderID());
  987. if (couponRecord != null) {
  988. newOrder.setClubCouponId(couponRecord.getClubCouponId());
  989. newOrder.setCouponOrderRecord(couponRecord);
  990. }
  991. }
  992. //获取订单客户
  993. OrderUserInfo orderUserInfo = orderUserInfoService.findByOrderID(newOrder.getOrderID());
  994. NewCmClub club = newCmClubDao.getclubByUserId(newOrder.getUserID());
  995. if (null != orderUserInfo) {
  996. newOrder.setBpOrderUserinfo(orderUserInfo);
  997. if (club != null) {
  998. //使用机构名称
  999. orderUserInfo.setName(club.getName());
  1000. }
  1001. }
  1002. //获取订单商品
  1003. List<NewOrderProduct> list = new ArrayList<>();
  1004. List<NewShopOrder> shopOrders = newShopOrderDao.findListByOrderID(newOrder.getOrderID());
  1005. if (CollectionUtils.isNotEmpty(shopOrders)) {
  1006. for (NewShopOrder shopOrder : shopOrders) {
  1007. List<NewOrderProduct> pList = newOrderProductDao.findListByShopOrderID(shopOrder.getShopOrderID());
  1008. pList.forEach(orderProduct -> {
  1009. if (orderProduct.getLadderPriceFlag() == 1) {
  1010. // 查询订单商品阶梯价格
  1011. List<OrderProductLadderPrice> ladderPriceList = newOrderProductDao.findladderPriceList(orderProduct.getOrderProductID());
  1012. if (null != ladderPriceList && ladderPriceList.size() > 0) {
  1013. IntStream.range(0, ladderPriceList.size()).forEach(i -> {
  1014. if (i == ladderPriceList.size() - 1) {
  1015. ladderPriceList.get(i).setBuyNumRangeShow("≥" + ladderPriceList.get(i).getBuyNum());
  1016. } else {
  1017. String buyNumRangeShow = ladderPriceList.get(i).getBuyNum() + "~" + (ladderPriceList.get(i + 1).getBuyNum() - 1);
  1018. ladderPriceList.get(i).setBuyNumRangeShow(buyNumRangeShow);
  1019. }
  1020. });
  1021. orderProduct.setOrderProductLadderPriceList(ladderPriceList);
  1022. }
  1023. }
  1024. //充值定金商品
  1025. if (6060 == orderProduct.getProductID()) {
  1026. newOrder.setRechargeGoods(1);
  1027. }
  1028. });
  1029. list.addAll(pList);
  1030. shopOrder.setNewOrderProducts(pList);
  1031. if (pList.stream().anyMatch(p -> p.getProductID().intValue() == 999))
  1032. shopOrder.setPostFeeCos("1");
  1033. pList.stream().forEach(item -> {
  1034. if (NewOrderStatus.hasReturn(newOrder.getStatus())) {
  1035. Integer returningNum = newOrderProductDao.getReturningNum(item.getOrderProductID());
  1036. Integer returnedNum = newOrderProductDao.getReturnedNum(item.getOrderProductID());
  1037. item.setReturningNum(returningNum);
  1038. item.setReturnedNum(returnedNum);
  1039. }
  1040. /**确认收货信息*/
  1041. if (NewOrderStatus.hasReceived(newOrder.getStatus())) {
  1042. Integer receivedNum = newOrderProductDao.getReceivedNum(item.getOrderProductID());
  1043. item.setReceivedNum(receivedNum);
  1044. }
  1045. String domain = SysConfig.getStringConfig("crm.server.domain");
  1046. item.setProductImage(AppUtils.getProductImageURL(item.getProductImage(), AppKeys.ORIGINAL_PICTURE, domain));
  1047. if (item != null && item.getOrderPromotionsId() != null && item.getOrderPromotionsId() > 0) {
  1048. item.setProductPromotion(cmPromotionDao.findOrderPromotions(item.getOrderPromotionsId()));
  1049. }
  1050. });
  1051. Double payed = cmPayShopRecordDao.sumByShopOrderID(shopOrder.getShopOrderID());
  1052. shopOrder.setPayed(payed);
  1053. //查询是否存在店铺促销活动
  1054. CmPromotion shopPromotion = null;
  1055. if (shopOrder.getOrderPromotionsId() != null && shopOrder.getOrderPromotionsId() > 0) {
  1056. shopPromotion = cmPromotionDao.findOrderPromotions(shopOrder.getOrderPromotionsId());
  1057. shopOrder.setShopPromotion(shopPromotion);
  1058. }
  1059. }
  1060. newOrder.setNewShopOrders(shopOrders);
  1061. }
  1062. if (CollectionUtils.isNotEmpty(list)) {
  1063. newOrder.setOrderProduct(list);
  1064. double freight = 0D;
  1065. double totalAddedValueTax = 0D;
  1066. for (NewOrderProduct op : list) {
  1067. if (op.getProductID().intValue() == 999) { //邮费商品
  1068. freight += op.getPrice();
  1069. }
  1070. totalAddedValueTax += op.getTotalAddedValueTax();
  1071. }
  1072. if ("1".equals(newOrder.getFreePostFlag())) newOrder.setFreight(freight);
  1073. newOrder.setTotalAddedValueTax(totalAddedValueTax);
  1074. }
  1075. shopOrders.sort((so1, so2) -> {
  1076. //给子订单排序 邮费排在最后 其余的按shopOrderID asc
  1077. if ("1".equals(so1.getPostFeeCos())) return 1;
  1078. return so1.getShopOrderID() - so2.getShopOrderID();
  1079. });
  1080. //获取订单发票
  1081. OrderInvoice orderInvoice = orderInvoiceDao.getWithorderId(newOrder.getOrderID() + "");
  1082. if (null != orderInvoice) {
  1083. newOrder.setOrderInvoice(orderInvoice);
  1084. }
  1085. }
  1086. return newOrder;
  1087. }
  1088. /**
  1089. * @return
  1090. * @Author ye.qin
  1091. * @Description //TODO 获取主订单详情
  1092. * @Date 2019\5\24 0024 10:45
  1093. * @Param
  1094. */
  1095. public NewOrder getNewOrder(CmReturnedPurchase cmReturnedPurchase) {
  1096. NewOrder newOrder = new NewOrder();
  1097. if (null != cmReturnedPurchase) {
  1098. newOrder = newOrderDao.get(cmReturnedPurchase.getOrderID().toString());
  1099. if (newOrder.getCouponAmount() > 0) {
  1100. CmCouponOrderRecord couponRecord = newOrderDao.findOrderCouponRecord(newOrder.getOrderID());
  1101. if (couponRecord != null) {
  1102. newOrder.setClubCouponId(couponRecord.getClubCouponId());
  1103. newOrder.setCouponOrderRecord(couponRecord);
  1104. }
  1105. }
  1106. //获取订单客户
  1107. OrderUserInfo orderUserInfo = orderUserInfoService.findByOrderID(cmReturnedPurchase.getOrderID());
  1108. NewCmClub club = newCmClubDao.getclubByUserId(newOrder.getUserID());
  1109. if (null != orderUserInfo) {
  1110. orderUserInfo = cmUserService.getBalance(orderUserInfo);
  1111. newOrder.setBpOrderUserinfo(orderUserInfo);
  1112. if (club != null) {
  1113. //使用机构名称
  1114. orderUserInfo.setName(club.getName());
  1115. }
  1116. }
  1117. List<NewShopOrder> shopOrders = newShopOrderDao.findListByOrderID(cmReturnedPurchase.getOrderID());
  1118. if (CollectionUtils.isNotEmpty(shopOrders)) {
  1119. for (NewShopOrder shopOrder : shopOrders) {
  1120. //获取退货退款记录
  1121. CmReturnedPurchaseProduct bean = new CmReturnedPurchaseProduct();
  1122. bean.setShopOrderID(shopOrder.getShopOrderID());
  1123. List<CmReturnedPurchaseProduct> cmReturnedPurchaseProductList = cmReturnedPurchaseProductDao.getCmReturnedPurchaseProductList(bean);
  1124. //获取订单商品
  1125. List<NewOrderProduct> list = newOrderProductDao.findListByShopOrderID(shopOrder.getShopOrderID());
  1126. if (CollectionUtils.isNotEmpty(list)) {
  1127. for (NewOrderProduct newOrderProduct : list) {
  1128. if (null == newOrderProduct.getReturnedPurchaseProductNum()) {
  1129. newOrderProduct.setReturnedPurchaseProductNum(0);
  1130. }
  1131. if (null == newOrderProduct.getReturningPurchaseProductNum()) {
  1132. newOrderProduct.setReturningPurchaseProductNum(0);
  1133. }
  1134. if (null == newOrderProduct.getCancelProductNum()) {
  1135. newOrderProduct.setCancelProductNum(0);
  1136. }
  1137. for (CmReturnedPurchaseProduct cmReturnedPurchaseProduct : cmReturnedPurchaseProductList) {
  1138. Boolean isFirstReturn = false;
  1139. if (newOrderProduct.getShopOrderID().equals(cmReturnedPurchaseProduct.getShopOrderID())
  1140. && newOrderProduct.getProductID().equals(cmReturnedPurchaseProduct.getProductID())) {
  1141. if (cmReturnedPurchaseProduct.getStatus().equals(String.valueOf(ReturnedPurchaseStatus.RETURNING_PURCHASE.getCode()))) {
  1142. newOrderProduct.setReturningPurchaseProductNum(newOrderProduct.getReturningPurchaseProductNum() + cmReturnedPurchaseProduct.getActualReturnedNum());
  1143. } else if (cmReturnedPurchaseProduct.getStatus().equals(String.valueOf(ReturnedPurchaseStatus.RETURNED_PURCHASE.getCode()))) {
  1144. newOrderProduct.setReturnedPurchaseProductNum(newOrderProduct.getReturnedPurchaseProductNum() + cmReturnedPurchaseProduct.getActualReturnedNum());
  1145. }
  1146. newOrderProduct.setCancelProductNum(newOrderProduct.getCancelProductNum() + cmReturnedPurchaseProduct.getActualCancelNum());
  1147. } else {
  1148. //是该订单商品第一次退货退款
  1149. isFirstReturn = true;
  1150. }
  1151. newOrderProduct.setFirstReturn(isFirstReturn);
  1152. }
  1153. }
  1154. }
  1155. if (CollectionUtils.isNotEmpty(list)) {
  1156. shopOrder.setNewOrderProducts(list);
  1157. }
  1158. //判断是否是运费订单(前端不予操作)(供应商ID TODO)
  1159. Product product = productDao.get(Global.getConfig("freightProductID"));
  1160. if (shopOrder.getShopID().equals(product.getShopID())) {
  1161. shopOrder.setDefaultStatus(true);
  1162. }
  1163. }
  1164. newOrder.setNewShopOrders(shopOrders);
  1165. }
  1166. //获取订单发票
  1167. OrderInvoice orderInvoice = orderInvoiceDao.getWithorderId(cmReturnedPurchase.getOrderID() + "");
  1168. if (null != orderInvoice) {
  1169. newOrder.setOrderInvoice(orderInvoice);
  1170. }
  1171. }
  1172. return newOrder;
  1173. }
  1174. public NewOrder findByOrderID(Integer orderID) {
  1175. return newOrderDao.findByOrderID(orderID);
  1176. }
  1177. @Transactional(readOnly = false)
  1178. public void confirmOrder(Integer orderID) {
  1179. NewOrder order = newOrderDao.findByOrderID(orderID);
  1180. order.setConfirmFlag("1");//确认订单标识 后台确认 1
  1181. order.setStatus("11");//订单状态变成 ==> 待收款待付款 11
  1182. //修改订单状态(余额抵扣)
  1183. if (order.getPayableAmount() != null) {
  1184. if (order.getPayableAmount() == 0 && order.getBalancePayFee() != null && order.getBalancePayFee() > 0) {
  1185. order.setStatus(NewOrderStatus.YISHOU_DAIFA.getCode());
  1186. order.setReceiptStatus("3");
  1187. } else if (order.getPayableAmount() != 0 && order.getBalancePayFee() != null && order.getBalancePayFee() > 0) {
  1188. order.setStatus(NewOrderStatus.BUSHOU_DAIFA.getCode());
  1189. order.setReceiptStatus("2");
  1190. }
  1191. }
  1192. Date date = new Date();
  1193. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  1194. String curDateStr = sdf.format(date);
  1195. order.setConfirmTime(curDateStr);
  1196. if (order.getBalancePayFee() != null && order.getBalancePayFee() > 0) {
  1197. saveDiscernReceipt(order.getBalancePayFee(), orderID);
  1198. //针对商品productId:6898,做兑换券操作(couponId:15)
  1199. if ("3".equals(order.getReceiptStatus())) {
  1200. List<NewOrderProduct> orderProducts = newOrderProductDao.findListByOrderID(orderID);
  1201. for (NewOrderProduct orderProduct : orderProducts) {
  1202. if (orderProduct.getProductID().equals(6898)) {
  1203. Integer num = orderProduct.getNum();
  1204. for (int i = 0; i < num; i++) {
  1205. CmCouponRedemptionCode redemptionCode = cmCouponClubDao.findRedemptionCode(15);
  1206. if (redemptionCode != null) {
  1207. CmCouponClub couponClub = new CmCouponClub();
  1208. couponClub.setCouponId(redemptionCode.getCouponId());
  1209. couponClub.setUserId(order.getUserID());
  1210. couponClub.setSource("5");
  1211. couponClub.setStatus("1");
  1212. couponClub.setCreateDate(new Date());
  1213. couponClub.setDelFlag("0");
  1214. cmCouponClubDao.insert(couponClub);
  1215. cmCouponClubDao.updateRedemptionCode(redemptionCode.getId(), couponClub.getId());
  1216. }
  1217. }
  1218. break;
  1219. }
  1220. }
  1221. }
  1222. }
  1223. newOrderDao.update(order);
  1224. }
  1225. /**
  1226. * 保存余额到收款记录
  1227. *
  1228. * @param balancePayFee 余额抵扣金额
  1229. */
  1230. private void saveDiscernReceipt(Double balancePayFee, Integer orderId) {
  1231. String curDateStr = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
  1232. //保存余额到收款记录
  1233. CmDiscernReceipt discernReceipt = new CmDiscernReceipt();
  1234. discernReceipt.setPayWay("3");
  1235. discernReceipt.setPayType("16");
  1236. discernReceipt.setReceiptType("1");
  1237. discernReceipt.setReceiptStatus("3");
  1238. discernReceipt.setReceiptAmount(balancePayFee.toString());
  1239. discernReceipt.setConfirmType("4");
  1240. discernReceipt.setReceiptDate(curDateStr);
  1241. discernReceipt.setConfirmDate(curDateStr);
  1242. discernReceipt.setReviewDate(curDateStr);
  1243. discernReceipt.setDelFlag("0");
  1244. cmDiscernReceiptDao.insert(discernReceipt);
  1245. CmReceiptOrderRelation relation = new CmReceiptOrderRelation();
  1246. relation.setReceiptID(discernReceipt.getId());
  1247. relation.setOrderID(orderId.toString());
  1248. relation.setAssociateAmount(balancePayFee.toString());
  1249. relation.setRelationType("2");
  1250. relation.setDelFlag("0");
  1251. cmReceiptOrderRelationDao.insert(relation);
  1252. }
  1253. @Transactional(readOnly = false)
  1254. public void update(NewOrder order) {
  1255. newOrderDao.update(order);
  1256. }
  1257. @Transactional(readOnly = false)
  1258. public void cancelOrder(Integer orderID) {
  1259. NewOrder order = newOrderDao.findByOrderID(orderID);
  1260. //余额退回原账户
  1261. CmUser user = cmUserDao.get(order.getUserID().toString());
  1262. if (order.getBalancePayFee() > 0) {
  1263. setBalance(user, order.getBalancePayFee(), order);
  1264. //取消收支记录
  1265. CmUserBalanceRecord cmUserBalanceRecord = new CmUserBalanceRecord();
  1266. cmUserBalanceRecord.setUserId(order.getUserID());
  1267. cmUserBalanceRecord.setOrderId(order.getOrderID());
  1268. cmUserBalanceRecord.setRemark("取消订单,余额记录无效-后台");
  1269. cmUserBalanceRecord.setDelFlag("1");
  1270. cmUserBalanceRecordService.updateBalanceRecord(cmUserBalanceRecord);
  1271. }
  1272. order.setStatus("6");//订单状态变成交易关闭 6
  1273. newOrderDao.updateStatus(order);
  1274. //二手订单取消订单,标记未售
  1275. if ("1".equals(order.getSecondHandOrderFlag())) {
  1276. List<NewOrderProduct> orderProducts = newOrderProductDao.findListByOrderID(orderID);
  1277. for (NewOrderProduct orderProduct : orderProducts) {
  1278. cmSecondHandDetailDao.updatSecondHnadBySold(orderProduct.getProductID());
  1279. }
  1280. }
  1281. //采美豆退回
  1282. if (order.getUserBeans() != null && order.getUserBeans() > 0) {
  1283. UserBeansHistory beansHistory = new UserBeansHistory();
  1284. beansHistory.setUserId(order.getUserID());
  1285. beansHistory.setOrderId(order.getOrderID());
  1286. beansHistory.setBeansType(9);
  1287. beansHistory.setType(1);
  1288. beansHistory.setNum(order.getUserBeans());
  1289. beansHistory.setPushStatus(0);
  1290. beansHistory.setAddTime(new Date());
  1291. newCmClubDao.insertBeansHistory(beansHistory);
  1292. int userBeans = user.getUserBeans() + order.getUserBeans();
  1293. cmUserDao.updateUserBeans(order.getUserID(), userBeans);
  1294. }
  1295. //取消订单短信推送(取消订单推送)
  1296. /*try {
  1297. if (user != null && StringUtils.isNotBlank(user.getBindMobile()) && "0".equals(order.getRebateFlag())) {
  1298. String wwwServer = Global.getConfig("wwwServer");
  1299. String shortLink = getShortLink(8, 11, wwwServer + "user/order/detail.html?orderId=" + orderID);
  1300. String content = "您已成功取消订单(订单编号:" + order.getOrderNo() + "),订单金额¥" + order.getPayTotalFee() + "。您可关注采美公众号或者访问采美微信小程序和网站查看订单。" +
  1301. "平台公众号:微信搜索“采美365网”; 微信小程序:微信搜索“采美采购商城”;网址:www.caimei365.com/t/" + shortLink;
  1302. boolean sendSms = getSendSms(11, user.getBindMobile(), content);
  1303. if (!sendSms) {
  1304. logger.info("取消订单推送失败,订单id>>>>" + orderID);
  1305. }
  1306. }
  1307. } catch (Exception e) {
  1308. e.printStackTrace();
  1309. }*/
  1310. //客服确认注册机构,一天内取消有效
  1311. if (user != null && "94".equals(user.getClubStatus())) {
  1312. Integer userId = user.getUserID();
  1313. Date confirmTime = cmUserDao.findByConfirmTime(userId);
  1314. if (confirmTime != null) {
  1315. Calendar calendar = Calendar.getInstance();
  1316. calendar.setTime(confirmTime);
  1317. calendar.add(Calendar.DATE, 1);
  1318. if (calendar.getTime().compareTo(new Date()) > 0) {
  1319. cmUserDao.updateByClubStatus(93, userId);
  1320. newCmClubDao.updateByStatus(93, userId);
  1321. }
  1322. }
  1323. }
  1324. //优惠券退回
  1325. if (order.getCouponAmount() > 0 && !"0".equals(order.getStatus())) {
  1326. CmCouponOrderRecord couponRecord = newOrderDao.findOrderCouponRecord(order.getOrderID());
  1327. if (couponRecord != null) {
  1328. CmCouponClub couponClub = cmCouponClubDao.get(couponRecord.getClubCouponId().toString());
  1329. couponClub.setOrderId(null);
  1330. couponClub.setReturnedId(0);
  1331. couponClub.setSource("3");
  1332. couponClub.setStatus("1");
  1333. couponClub.setCreateDate(new Date());
  1334. couponClub.setUseDate(null);
  1335. couponClub.setDelFlag("0");
  1336. cmCouponClubDao.insert(couponClub);
  1337. }
  1338. }
  1339. }
  1340. /**
  1341. * @return
  1342. * @Author ye.qin
  1343. * @Description //TODO 设置余额
  1344. * @Date 2019\6\20 0020 16:40
  1345. * @Param
  1346. */
  1347. @Transactional(readOnly = false)
  1348. public void setBalance(CmUser user, Double amount, NewOrder order) {
  1349. if (UserType.isMaker(Integer.parseInt(user.getRegisterUserTypeID()))) {
  1350. return;
  1351. }
  1352. if (UserType.isClub(Integer.parseInt(user.getRegisterUserTypeID()))) {
  1353. user = cmUserDao.get(user.getCompanyUserID().toString());
  1354. }
  1355. String status = order.getStatus();//0待确认
  1356. logger.info("----------------------->原余额:" + user.getUserMoney() + "==原可用余额:" + user.getAbleUserMoney());
  1357. //减操作不更新可用余额
  1358. if (amount < 0d) {
  1359. if (!"0".equals(status)) {//待确认状态不需要修改余额,因为本身存在冻结余额不需要重复退回
  1360. user.setUserMoney(user.getUserMoney() + amount);
  1361. }
  1362. } else {
  1363. if (!"0".equals(status)) {//待确认状态不需要修改余额,因为本身存在冻结余额不需要重复退回
  1364. user.setUserMoney(user.getUserMoney() + amount);
  1365. }
  1366. user.setAbleUserMoney(user.getAbleUserMoney() + amount);
  1367. }
  1368. logger.info("----------------------->设置余额:" + amount);
  1369. logger.info("----------------------->当前余额:" + user.getUserMoney() + "==当前可用余额:" + user.getAbleUserMoney());
  1370. cmUserDao.updateMoney(user);
  1371. }
  1372. /**
  1373. * 发货
  1374. *
  1375. * @param deliveryData 子订单对应订单商品的Map{shopOrderID : [orderProductList], }
  1376. * @param orderProducts 发货的订单商品集合
  1377. * @param orderProductMap 发货的orderProductID 发货数量集合
  1378. * @param logisticsInfo 物流公司单号MAP
  1379. * @param remarks 备注
  1380. */
  1381. @Transactional(readOnly = false)
  1382. public String delivery
  1383. (Map<Integer, List<NewOrderProduct>> deliveryData, List<NewOrderProduct> orderProducts, Map<Integer, Integer> orderProductMap, Map<String, List<String>> logisticsInfo, String
  1384. remarks, String remarkImage) throws Exception {
  1385. //更新这一次发货的子订单信息
  1386. Integer orderID = null;
  1387. for (Map.Entry<Integer, List<NewOrderProduct>> entry : deliveryData.entrySet()) {
  1388. NewShopOrder shopOrder = newShopOrderDao.get(entry.getKey() + "");
  1389. Integer outStoreNum = shopOrder.getOutStoreNum();
  1390. if (null == outStoreNum) {
  1391. outStoreNum = 0;
  1392. }
  1393. int num = entry.getValue().stream().mapToInt(NewOrderProduct::getThisTimePostNum).sum();
  1394. if (outStoreNum + num > (shopOrder.getItemCount() + shopOrder.getPresentNum())) {
  1395. throw new Exception("发货数量异常");
  1396. }
  1397. shopOrder.setOutStoreNum(outStoreNum + num);//更新子订单总的出库数量
  1398. if (shopOrder.getOutStoreNum() < shopOrder.getItemCount()) {
  1399. //部分发货
  1400. shopOrder.setSendOutStatus("2");
  1401. } else {
  1402. //发货完成 状态为待收货
  1403. shopOrder.setSendOutStatus("3");
  1404. // 子订单发货完成以后 计算系统自动收货时间
  1405. long curTimeMills = System.currentTimeMillis();
  1406. long autoCloseTimeMills = curTimeMills;
  1407. NewOrderConfig cfg = newOrderConfigDao.getValueByKey(CmOrderConfigEnum.AUTO_RECEIPT_TIME.getCode());
  1408. if (cfg == null || null == cfg.getValue() || cfg.getValue() == 0) {
  1409. autoCloseTimeMills = 0;
  1410. } else {
  1411. autoCloseTimeMills += cfg.getValue() * 60 * 1000;
  1412. }
  1413. shopOrder.setAutoReceiveTimeMills(autoCloseTimeMills);
  1414. }
  1415. shopOrder.setSplitFlag("0");//发货以后拆单标识订单无法拆分
  1416. shopOrder.setOutStoreTimes(shopOrder.getOutStoreTimes() + 1); //发货批次加一
  1417. newShopOrderDao.update(shopOrder);
  1418. orderID = shopOrder.getOrderID();
  1419. }
  1420. //同步更新主订单的发货状态
  1421. NewOrder order = newOrderDao.findByOrderID(orderID);
  1422. String sendOutStatus = order.getSendOutStatus();
  1423. List<NewShopOrder> shopOrders = newShopOrderDao.findListByOrderID(order.getOrderID());
  1424. String statusSuffix = "";
  1425. if (shopOrders.stream().allMatch(s -> "3".equals(s.getSendOutStatus()))) {
  1426. //所有的子订单都已经完成发货了
  1427. statusSuffix = "3";
  1428. order.setSendOutStatus("3");
  1429. } else {
  1430. //代码走到这里订单肯定是有发货了 整个订单里面的商品没有全部发完 那就是部分发货了
  1431. statusSuffix = "2";
  1432. order.setSendOutStatus("2");
  1433. }
  1434. if (order.getStatus().length() == 2) {
  1435. order.setStatus(order.getStatus().substring(0, 1) + statusSuffix);
  1436. } else {
  1437. logger.info("=====> 主订单状态异常 ---- 发货方法中 ==" + order.getStatus());
  1438. throw new Exception("主订单状态异常");
  1439. }
  1440. newOrderDao.update(order);
  1441. //新增发货批次记录
  1442. LogisticsBatch lb = new LogisticsBatch();
  1443. lb.setShopOrderID(null); //5.0.0现在根据主订单去发货了
  1444. lb.setOrderID(orderID);
  1445. lb.setMailer("0");//邮寄者 0 采美 1 供应商 后台邮寄者为采美
  1446. lb.setUpdateDate(new Date());
  1447. lb.setDeliveryTime(new Date());
  1448. lb.setRemark(remarks);
  1449. lb.setRemarkImage(remarkImage);
  1450. logisticsBatchDao.insert(lb);
  1451. for (NewOrderProduct o : orderProducts) {
  1452. newOrderProductDao.updateForDelivery(o);
  1453. LogisticsRecord l = new LogisticsRecord();
  1454. l.setLogisticsBatchID(Integer.valueOf(lb.getId()));
  1455. l.setShopOrderID(o.getShopOrderID());
  1456. l.setOrderID(o.getOrderID());
  1457. l.setOrderProductID(o.getOrderProductID());
  1458. l.setBuyNum(o.getNum());
  1459. l.setNum(orderProductMap.get(o.getOrderProductID()));
  1460. l.setProductID(o.getProductID());
  1461. l.setProductName(o.getName());
  1462. l.setImage(o.getImage());
  1463. logisticsRecordDao.insert(l);
  1464. }
  1465. for (Map.Entry<String, List<String>> e : logisticsInfo.entrySet()) {
  1466. for (String nu : e.getValue()) {
  1467. LogisticsInformation l = new LogisticsInformation();
  1468. l.setLogisticsBatchID(Integer.valueOf(lb.getId()));
  1469. l.setType("");// 类型:1 采美365 2 呵呵商城 3 大宗采购 todo
  1470. l.setShopOrderID(null);
  1471. l.setOrderID(orderID);
  1472. l.setNu(nu);
  1473. /*
  1474. * 快递单当前的状态(0:在途,即货物处于运输过程中;
  1475. * 1:揽件,货物已由快递公司揽收并且产生了第一条跟踪信息;
  1476. * 2:疑难,货物寄送过程出了问题;
  1477. * 3:签收,收件人已签收;
  1478. * 4:退签,即货物由于用户拒签、超区等原因退回,而且发件人已经签收;
  1479. * 5:派件,即快递正在进行同城派件;
  1480. * 6:退回,货物正处于退回发件人的途中;)
  1481. */
  1482. l.setState("1");
  1483. l.setRemarks(remarks);
  1484. String value = DictUtils.getDictValue(e.getKey(), "kd_type", ""); // 物流公司代码
  1485. l.setLogisticsCompanyName(e.getKey());//物流公司名称
  1486. l.setLogisticsCompanyCode(value);//物流公司代码
  1487. l.setShopID(null);
  1488. l.setShopOrderID(null);
  1489. l.setUpdateDate(new Date());
  1490. logisticsInformationDao.insert(l);
  1491. }
  1492. }
  1493. /*try {
  1494. //发货短信推送(取消推送)
  1495. CmUser user = cmUserDao.get(order.getUserID().toString());
  1496. if (user != null && StringUtils.isNotBlank(user.getBindMobile()) && "0".equals(order.getRebateFlag())) {
  1497. String wwwServer = Global.getConfig("wwwServer");
  1498. boolean sendSms = false;
  1499. if ("2".equals(order.getSendOutStatus()) && "1".equals(sendOutStatus)) {
  1500. //部分发货
  1501. String shortLink = getShortLink(8, 7, wwwServer + "user/order/detail.html?orderId=" + order.getOrderID());
  1502. String content = "您的订单(订单编号:" + order.getOrderNo() + ")已部分发货。您可关注采美公众号或者访问采美微信小程序和网站查看订单。平台公众号:微信搜索“采美365网”; " +
  1503. "微信小程序:微信搜索“采美采购商城”;网址:www.caimei365.com/t/" + shortLink;
  1504. sendSms = getSendSms(7, user.getBindMobile(), content);
  1505. } else if ("3".equals(order.getSendOutStatus())) {
  1506. //已发货
  1507. String shortLink = getShortLink(8, 8, wwwServer + "user/order/detail.html?orderId=" + order.getOrderID());
  1508. String content = "您的订单(订单编号:" + order.getOrderNo() + ")已发货完毕。您可关注采美公众号或者访问采美微信小程序和网站查看订单。平台公众号:微信搜索“采美365网”; " +
  1509. "微信小程序:微信搜索“采美采购商城”;网址:www.caimei365.com/t/" + shortLink;
  1510. sendSms = getSendSms(8, user.getBindMobile(), content);
  1511. }
  1512. if (!sendSms) {
  1513. logger.info("发货短信推送失败,订单id>>>>" + order.getOrderID());
  1514. }
  1515. }
  1516. } catch (Exception e) {
  1517. e.printStackTrace();
  1518. }*/
  1519. return lb.getId();
  1520. }
  1521. /**
  1522. * 手动拆单
  1523. *
  1524. * @param shopOrderID 拆分的子订单编号
  1525. * @param oldOrderProductList 原有的orderProduct
  1526. * @param newOrderProductList 拆单新增的orderProduct
  1527. * @return 新拆分的子订单ID
  1528. */
  1529. @Transactional(readOnly = false)
  1530. public Integer splitOrder(Integer shopOrderID, List<NewOrderProduct> oldOrderProductList, List<NewOrderProduct> newOrderProductList, List<NewCmFinanceReceipts> cfrBakList) throws BusinessException {
  1531. NewShopOrder dbShopOrder = newShopOrderDao.get(shopOrderID + "");
  1532. newShopOrderDao.shopOrderBak(newShopOrderDao.get(shopOrderID + "")); //子订单拆分前备份
  1533. NewShopOrder newShopOrder = newShopOrderDao.get(shopOrderID + "");
  1534. newShopOrder.setShopOrderID(null);
  1535. newShopOrder.setShopID(1000);// shopID = 1000 数据库固定数据表示采美
  1536. List<NewShopOrder> so = newShopOrderDao.findListByOrderID(dbShopOrder.getOrderID());
  1537. int bigNum = 0; //记录最大子订单编号
  1538. for (NewShopOrder s : so) {
  1539. int shopOrderIndex = Integer.valueOf(s.getShopOrderNo().substring(s.getShopOrderNo().length() - 2));
  1540. bigNum = bigNum < shopOrderIndex ? shopOrderIndex : bigNum;
  1541. }
  1542. if (dbShopOrder.getFee() == null || dbShopOrder.getFee().intValue() == -1) {
  1543. newShopOrder.setFee(-1d); // 邮费到付
  1544. } else {
  1545. double fee = dbShopOrder.getFee() / 2;
  1546. dbShopOrder.setFee(fee); // 订单拆分后 邮费均分
  1547. newShopOrder.setFee(fee);
  1548. }
  1549. dbShopOrder.setSplitFlag("0");// 拆分后订单无法再次拆分
  1550. newShopOrder.setSplitFlag("0");
  1551. OrderUtil.updateShopOrderInfo(dbShopOrder, oldOrderProductList, null); // 根据拆分后的订单商品重新统计子订单信息
  1552. newShopOrderDao.updateByShopOrderID(dbShopOrder);// 更新原来的子订单
  1553. OrderUtil.updateShopOrderInfo(newShopOrder, newOrderProductList, null);
  1554. newShopOrder.setShopOrderNo(OrderUtil.getshopOrderNo(dbShopOrder.getOrderNo(), ++bigNum));
  1555. newShopOrderDao.insert(newShopOrder);// 插入新增的拆分订单
  1556. String orderProductIDs = "";
  1557. boolean flag = false;
  1558. for (NewOrderProduct o : oldOrderProductList) {
  1559. if ("1".equals(o.getDelFlag())) {
  1560. newOrderProductDao.delete(o);
  1561. } else {
  1562. newOrderProductDao.update(o);
  1563. }
  1564. }
  1565. for (NewOrderProduct n : newOrderProductList) {
  1566. n.setShopOrderID(newShopOrder.getShopOrderID());
  1567. n.setShopOrderNo(newShopOrder.getShopOrderNo());
  1568. NewCmShop shop = newCmShopDao.get(String.valueOf(n.getShopID()));
  1569. if (shop != null) {
  1570. n.setShopName(shop.getName());
  1571. }
  1572. if (n.getLadderPriceFlag() == null) {
  1573. n.setLadderPriceFlag(0);
  1574. }
  1575. newOrderProductDao.insert(n);
  1576. orderProductIDs = orderProductIDs + ("," + n.getOrderProductID().toString());
  1577. }
  1578. List<NewShopOrder> shopOrderList = newShopOrderDao.findListByOrderID(dbShopOrder.getOrderID());
  1579. boolean f = true;
  1580. for (NewShopOrder s : shopOrderList) {
  1581. if ("1".equals(s.getSplitFlag())) {
  1582. f = false;
  1583. break;
  1584. }
  1585. }
  1586. NewOrder order = newOrderDao.findByOrderID(newShopOrder.getOrderID());
  1587. if (f) {
  1588. order.setSplitFlag("0");// 所有的子订单都已经拆单过 主订单 的拆单标识也要改变
  1589. }
  1590. String shopOrderIDs = "";
  1591. for (int i = 0; i < shopOrderList.size(); i++) {
  1592. if (i == shopOrderList.size() - 1) {
  1593. shopOrderIDs = shopOrderIDs + shopOrderList.get(i).getShopOrderID();
  1594. } else {
  1595. shopOrderIDs += shopOrderList.get(i).getShopOrderID() + ",";
  1596. }
  1597. }
  1598. order.setShopOrderIDs(shopOrderIDs);
  1599. newOrderDao.update(order);
  1600. return newShopOrder.getShopOrderID();
  1601. }
  1602. /**
  1603. * 更新普通订单
  1604. *
  1605. * @param newOrder
  1606. */
  1607. @Transactional(readOnly = false)
  1608. public void updateNormalOrder(NewOrder newOrder) {
  1609. newOrder.setPayTotalFee(MathUtil.sub(newOrder.getOrderTotalFee(), newOrder.getBalancePayFee()).doubleValue());
  1610. newOrderDao.update(newOrder);
  1611. //采购中选中保存的订单商品
  1612. List<NewOrderProduct> orderProducts = newOrder.getOrderProduct();
  1613. //数据库中的订单商品
  1614. NewOrderProduct newOrderProduct = new NewOrderProduct();
  1615. newOrderProduct.setOrderID(newOrder.getOrderID());
  1616. List<NewOrderProduct> dbOrderProducts = newOrderProductDao.findAllList(newOrderProduct);
  1617. // 重新保存逻辑
  1618. //把从页面上传过来的orderProduct 根据 shopID 来分组
  1619. Map<Integer, List<NewOrderProduct>> orderProductMap = new HashMap<>();
  1620. for (NewOrderProduct op : newOrder.getOrderProduct()) {
  1621. if (orderProductMap.containsKey(op.getShopID())) {
  1622. orderProductMap.get(op.getShopID()).add(op);
  1623. } else {
  1624. List<NewOrderProduct> l = new ArrayList<>();
  1625. l.add(op);
  1626. orderProductMap.put(op.getShopID(), l);
  1627. }
  1628. }
  1629. // orderProduct 分组完成
  1630. //开始更新shopOrder
  1631. List<NewShopOrder> dbShopOrders = newShopOrderDao.findListByOrderID(newOrder.getOrderID());
  1632. int shopOrderNoIndex = 0; //记录子订单的最大编号 , 新添加的子订单编号一次往后增加
  1633. //删除多余的shopOrder记录
  1634. for (NewShopOrder s : dbShopOrders) {
  1635. // 说明这个重新选择的orderProduct已经不包含这个供应商shopID的商品了
  1636. if (!orderProductMap.containsKey(s.getShopID()))
  1637. newShopOrderDao.delete(s);
  1638. int shopOrderIndex = Integer.valueOf(s.getShopOrderNo().substring(s.getShopOrderNo().length() - 2));
  1639. shopOrderNoIndex = shopOrderNoIndex < shopOrderIndex ? shopOrderIndex : shopOrderNoIndex;
  1640. }
  1641. //更新其余的shopOrder的信息
  1642. A:
  1643. for (Map.Entry<Integer, List<NewOrderProduct>> entry : orderProductMap.entrySet()) {
  1644. for (NewShopOrder s : dbShopOrders) {
  1645. if (s.getShopID().intValue() == entry.getKey().intValue()) {
  1646. OrderUtil.updateShopOrderInfo(s, entry.getValue(), null);
  1647. newShopOrderDao.update(s);
  1648. continue A;
  1649. }
  1650. }
  1651. NewShopOrder newShopOrder = new NewShopOrder();
  1652. OrderUtil.updateShopOrderInfo(newShopOrder, entry.getValue(), null);
  1653. newShopOrder.setShopOrderNo(OrderUtil.getshopOrderNo(newOrder.getOrderNo(), ++shopOrderNoIndex));
  1654. newShopOrder.setOrderNo(newOrder.getOrderNo());
  1655. newShopOrder.setOrderID(newOrder.getOrderID());
  1656. newShopOrder.setOutStoreNum(0);
  1657. newShopOrderDao.insert(newShopOrder);
  1658. for (NewOrderProduct product : orderProducts) {
  1659. if (product.getShopID().intValue() == newShopOrder.getShopID().intValue()) {
  1660. product.setShopOrderID(newShopOrder.getShopOrderID());
  1661. product.setShopOrderNo(newShopOrder.getShopOrderNo());
  1662. }
  1663. }
  1664. }
  1665. List<NewShopOrder> shopOrders = newShopOrderDao.findListByOrderID(newOrder.getOrderID());
  1666. Map<Integer, Integer> dbShopInfoID = new HashMap<>(); //用来存放数据库中这个订单原来的子订单中 供应商的信息 key = shopID value = shopOrderNo
  1667. Map<Integer, String> dbShopInfoNo = new HashMap<>(); //用来存放数据库中这个订单原来的子订单中 供应商的信息 key = shopID value = shopOrderID
  1668. for (NewShopOrder so : shopOrders) {
  1669. dbShopInfoID.put(so.getShopID(), so.getShopOrderID());
  1670. dbShopInfoNo.put(so.getShopID(), so.getShopOrderNo());
  1671. }
  1672. if (CollectionUtils.isNotEmpty(orderProducts)) {
  1673. for (NewOrderProduct product : orderProducts) {
  1674. if (product.getLadderPriceFlag() == null) {
  1675. product.setLadderPriceFlag(0);
  1676. }
  1677. if (product.getOrderProductID() == null) {//新增:表单订单商品ID为空
  1678. product.setOrderNo(newOrder.getOrderNo());
  1679. product.setOrderID(newOrder.getOrderID());
  1680. if (dbShopInfoID.containsKey(product.getShopID())) {
  1681. //数据库子订单中包含了这个供应商 就不需要添加子订单
  1682. product.setShopOrderID(dbShopInfoID.get(product.getShopID()));
  1683. product.setShopOrderNo(dbShopInfoNo.get(product.getShopID()));
  1684. }
  1685. newOrderProductDao.insert(product);
  1686. } else {//修改:表单所有ID不为空的修改
  1687. if (CollectionUtils.isNotEmpty(dbOrderProducts)) {
  1688. for (NewOrderProduct dbProduct : dbOrderProducts) {
  1689. if (StringUtils.equals(dbProduct.getId(), product.getId())) {
  1690. product.setOrderID(newOrder.getOrderID());
  1691. newOrderProductDao.update(product);
  1692. }
  1693. }
  1694. }
  1695. }
  1696. }
  1697. }
  1698. //删除
  1699. if (CollectionUtils.isNotEmpty(orderProducts)) {
  1700. for (NewOrderProduct dbProduct : dbOrderProducts) {
  1701. boolean b = true;//删除
  1702. for (NewOrderProduct product : orderProducts) {
  1703. if (dbProduct.getProductID().intValue() == product.getProductID().intValue()) {
  1704. b = false;//不删除
  1705. break;
  1706. }
  1707. }
  1708. //删除:数据库有,表单没有的
  1709. if (b) {
  1710. dbProduct.setDelFlag(DateUtils.formatDate(new Date(), "yyyyMMddHHmmssSSSS"));
  1711. newOrderProductDao.delete(dbProduct);
  1712. }
  1713. }
  1714. }
  1715. }
  1716. @Transactional(readOnly = false)
  1717. public void deleteOrder(NewOrder order) {
  1718. order.setDelFlag("1");
  1719. newOrderDao.update(order);
  1720. if (order.getNewShopOrders() == null) return;
  1721. for (NewShopOrder so : order.getNewShopOrders()) {
  1722. so.setDelFlag("1");
  1723. newShopOrderDao.update(so);
  1724. }
  1725. }
  1726. @Transactional(readOnly = false)
  1727. public void updateOrderStatus(String orderId, String orderStatus) {
  1728. newShopOrderDao.updateOrderStatus(orderId, orderStatus);
  1729. }
  1730. @Override
  1731. public Page<NewOrder> findPage(Page<NewOrder> page, NewOrder entity) {
  1732. Page<NewOrder> pageResult = super.findPage(page, entity);
  1733. List<NewOrder> results = pageResult.getList();
  1734. List<Integer> oId = results.stream().map(NewOrder::getOrderID).collect(Collectors.toList());
  1735. //看看这些订单有哪些是返佣订单 返回他们的orderID
  1736. List<Integer> orderIds = null;
  1737. if (CollectionUtils.isNotEmpty(oId)) {
  1738. orderIds = cmDiscernReceiptDao.findRebateOrderID(results.stream().map(NewOrder::getOrderID).collect(Collectors.toList()));
  1739. }
  1740. //从查询到的订单列表中 找到正在退款中的订单集合
  1741. List<Integer> orderIdsInReturn = null;
  1742. List<Integer> orderIdsInApplyReturn = null;//查询可以申请退款的订单ID
  1743. if (CollectionUtils.isNotEmpty(oId)) {
  1744. orderIdsInReturn = cmReturnedPurchaseDao.findOrderIDInReturnPurchase(oId);
  1745. orderIdsInApplyReturn = cmReturnedPurchaseDao.findOrderIDsInApplyReturnFlag(oId);
  1746. }
  1747. for (NewOrder order : results) {
  1748. CmUser user = cmUserDao.get(order.getUserID().toString());
  1749. Double ableUserMoney = user.getAbleUserMoney() == null ? 0d : user.getAbleUserMoney();
  1750. order.setAbleUserMoney(ableUserMoney);
  1751. if ((orderIds != null && orderIds.contains(order.getOrderID())) || "1".equals(order.getRebateFlag())) {
  1752. order.setRebateOrder("1");
  1753. } else {
  1754. order.setRebateOrder("0");
  1755. List<Integer> ids = cmReceiptOrderRelationDao.toAudit(order.getOrderID());
  1756. if (ids != null && ids.size() > 0) {
  1757. order.setToAudit("1");
  1758. }
  1759. }
  1760. if (orderIdsInReturn != null && orderIdsInReturn.contains(order.getOrderID())) {
  1761. order.setReturnedPurchaseStatus("1");
  1762. } else {
  1763. order.setReturnedPurchaseStatus("0");
  1764. }
  1765. if (orderIdsInApplyReturn != null && orderIdsInApplyReturn.contains(order.getOrderID())) {
  1766. order.setApplyReturnedPurchaseFlag("0");
  1767. } else {
  1768. order.setApplyReturnedPurchaseFlag("1");
  1769. }
  1770. List<NewShopOrder> shopOrders = order.getNewShopOrders();
  1771. if (shopOrders != null && shopOrders.size() == 1) {
  1772. order.setShopName(shopOrders.get(0).getShopName());
  1773. }
  1774. int count = 0;
  1775. for (NewShopOrder shopOrder : order.getNewShopOrders()) {
  1776. shopOrder.setOrderID(order.getOrderID());
  1777. shopOrder.setOrderNo(order.getOrderNo());
  1778. shopOrder.setOrderType(Integer.parseInt(order.getOrderType()));
  1779. shopOrder.setReceiver(order.getReceiver());
  1780. shopOrder.setOrderSource(order.getOrderSource());
  1781. shopOrder.setOrderTime(order.getOrderTime());
  1782. shopOrder.setBuyer(order.getBuyer());
  1783. if (shopOrder.getShopID() != 998) {
  1784. count++;
  1785. }
  1786. Integer shopOrderID = shopOrder.getShopOrderID();//子订单ID
  1787. //通过子订单ID查询子订单信息
  1788. NewShopOrder newShopOrder = newShopOrderDao.get(String.valueOf(shopOrderID));
  1789. if (null != newShopOrder) {
  1790. shopOrder.setFee(newShopOrder.getFee());
  1791. shopOrder.setShouldPayProduct(newShopOrder.getShouldPayProduct());
  1792. List<NewOrderProduct> pList = newOrderProductDao.findListByShopOrderID(shopOrderID);
  1793. pList.forEach(orderProduct -> {
  1794. //充值定金商品
  1795. if (6060 == orderProduct.getProductID()) {
  1796. order.setRechargeGoods(1);
  1797. }
  1798. });
  1799. } else {
  1800. shopOrder.setFee(0d);
  1801. shopOrder.setShouldPayProduct(0d);
  1802. }
  1803. }
  1804. //一个子订单只有一个商品时,不可拆分
  1805. if (order.getProductCount() == null) {
  1806. order.setProductCount(1);
  1807. }
  1808. if (order.getProductCount() <= count) {
  1809. order.setSplitFlag("0");
  1810. }
  1811. //是否抹平支付过(抹平最多只允许存在一次)
  1812. CmDiscernReceipt cmDiscernReceipt = cmDiscernReceiptDao.findSmoothoutInfo(order.getOrderID().toString());
  1813. if (null != cmDiscernReceipt) {
  1814. order.setAssociationType(cmDiscernReceipt.getAssociationType());
  1815. String confirmType = cmDiscernReceipt.getConfirmType();
  1816. order.setConfirmType(confirmType);
  1817. // 是否是一比款收了多个订单
  1818. if (StringUtils.equals(confirmType, "1") || StringUtils.equals(confirmType, "2") || StringUtils.equals(confirmType, "3")) {
  1819. List<CmReceiptOrderRelation> byReceiptList = cmReceiptOrderRelationService.findByReceiptID(cmDiscernReceipt.getId());
  1820. if (CollectionUtils.isNotEmpty(byReceiptList) && byReceiptList.size() > 1) {
  1821. order.setReceiptOrderFlag(true);
  1822. }
  1823. }
  1824. }
  1825. // 订单已收款才会出现抹平或者多收退余额,(已收再退款或者撤销退款订单即使存在抹平也需要当未抹平重新计算付款)
  1826. // 抹平明细
  1827. String receiptStatus = order.getReceiptStatus();
  1828. if (StringUtils.equals("3", receiptStatus)) {
  1829. if (null != cmDiscernReceipt) {
  1830. String confirmType = cmDiscernReceipt.getConfirmType();
  1831. order.setConfirmType(confirmType);
  1832. double associateAmount = cmDiscernReceiptDao.getAssociateAmount(String.valueOf(order.getOrderID()));
  1833. order.setOrderReceivedAmount(associateAmount);
  1834. //大额退余额
  1835. if (StringUtils.equals("3", confirmType)) {
  1836. String id = cmDiscernReceipt.getId();
  1837. double returnBalanceAmount = cmDiscernReceiptDao.getReturnBalanceAmount(id);
  1838. order.setReturnBalanceAmount(returnBalanceAmount);
  1839. }
  1840. }
  1841. }
  1842. }
  1843. return pageResult;
  1844. }
  1845. /**
  1846. * 判断是否是游客
  1847. *
  1848. * @param userId
  1849. * @return
  1850. */
  1851. public boolean isVisitor(String userId) {
  1852. if (userId == null) {
  1853. return true;
  1854. }
  1855. CmUser user = cmUserDao.get(userId);
  1856. //会所权限(会所企业、经理、员工等没上线或没审核)、普通权限(游客、系统普通用户)用户都可能存在游客价格显示
  1857. Integer permission = UserUtils.userPermission(user);//查看用户权限类型0 未登录身份 游客身份 1 登录普通用户身份 2 登录会所身份 4 登录协销身份
  1858. if (permission == 0 || permission == 1) {
  1859. List<CmShopOrder> userPayOrder = cmUserDao.getUserPayOrder(user.getUserID());
  1860. if (!org.springframework.util.CollectionUtils.isEmpty(userPayOrder) && userPayOrder.size() > 0) {
  1861. //用户存在已支付的订单(不为游客)
  1862. return false;
  1863. } else {
  1864. //用户没有已付款完成的订单(游客)
  1865. return true;
  1866. }
  1867. } else {
  1868. return false;//非游客价
  1869. }
  1870. }
  1871. @Transactional(readOnly = false)
  1872. public void postageOrderSave(NewOrder newOrder) {
  1873. //后台添加订单状态为0;待确认
  1874. if (StringUtils.isEmpty(newOrder.getStatus())) {
  1875. newOrder.setStatus("13");
  1876. }
  1877. //后台添加订单订单提交类型;后台提交4
  1878. if (StringUtils.isEmpty(newOrder.getOrderSubmitType())) {
  1879. newOrder.setOrderSubmitType("4");
  1880. }
  1881. //如果是[5:外单]类型则订单状态直接为交易完成
  1882. if (StringUtils.equals("5", newOrder.getOrderSource())) {
  1883. newOrder.setConfirmFlag("1");//标记为确认订单
  1884. }
  1885. if (newOrder.getOrderID() == null) {
  1886. // lwt 订单的下单时间和单号 都再订单保存后再展示
  1887. newOrder.setOrderNo(OrderUtil.geneAdminOrderNo());
  1888. newOrder.setOrderTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
  1889. newOrder.setOrderType("0"); // 订单类型 协销订单 0 普通订单 1
  1890. newOrder.setOrderSubmitType("4");
  1891. newOrder.setSplitFlag("0"); //订单不可拆分
  1892. }
  1893. newOrder.setClauseContent("");
  1894. newOrder.setClauseName("");
  1895. newOrder.setFreePostFlag("1");
  1896. newOrder.setPostageOrderFlag("1");
  1897. newOrder.setSendOutStatus("3");
  1898. newOrder.setPayStatus("3");
  1899. newOrder.setReceiptStatus("1");
  1900. boolean flag = false;//是否新增标志
  1901. if (newOrder.getOrderID() == null) {
  1902. flag = true;
  1903. newOrder.setOrderNo(OrderUtil.geneAdminOrderNo());
  1904. }
  1905. if (null == newOrder.getDiscountFee()) {//设置折扣
  1906. newOrder.setDiscountFee(0d);
  1907. }
  1908. if (null == newOrder.getBalancePayFee()) {//设置余额
  1909. newOrder.setBalancePayFee(0d);
  1910. }
  1911. if (newOrder.getPayFlag() == null) {//设置付款标识
  1912. newOrder.setPayFlag("0");
  1913. }
  1914. if (newOrder.getHasActProduct() == null) {
  1915. newOrder.setHasActProduct("0");
  1916. }
  1917. if (newOrder.getOnlinePayFlag() == null) {
  1918. newOrder.setOnlinePayFlag("0");
  1919. }
  1920. if (!StringUtils.equals("1", newOrder.getConfirmFlag())) {
  1921. newOrder.setConfirmFlag("0");
  1922. }
  1923. // 协销订单设置会所信息
  1924. if (newOrder.getBpOrderUserinfo() != null && newOrder.getBpOrderUserinfo().getClubId() != null) {
  1925. newOrder.setClubID(newOrder.getBpOrderUserinfo().getClubId().intValue());
  1926. NewCmClub club = newCmClubDao.get(newOrder.getBpOrderUserinfo().getClubId().toString());
  1927. if (null != club) {
  1928. newOrder.setUserID(club.getUserID());
  1929. }
  1930. }
  1931. newOrder.setPreferential(0D);
  1932. newOrder.setProductTotalFee(newOrder.getFreight());
  1933. newOrder.setOrderTotalFee(newOrder.getFreight());
  1934. newOrder.setPayTotalFee(newOrder.getFreight());
  1935. newOrder.setPayableAmount(newOrder.getFreight());
  1936. newOrder.setDiscountFee(0D);
  1937. newOrder.setBalancePayFee(0D);
  1938. if (newOrder.getOrderID() == null) {
  1939. newOrderDao.insert(newOrder);
  1940. } else {
  1941. newOrderDao.update(newOrder);
  1942. }
  1943. OrderUserInfo orderUserInfo = newOrder.getBpOrderUserinfo();
  1944. if (flag) {//新增
  1945. orderUserInfo.setOrderId(Long.valueOf(newOrder.getOrderID()));
  1946. }
  1947. orderUserInfoService.saveWithcity(orderUserInfo);
  1948. //如果不包邮 增加运费商品子订单(先删除掉相关订单和订单商品)运费商品ID 999
  1949. Integer freightProductID = 999;
  1950. NewShopOrder freightShopOrder = new NewShopOrder();
  1951. NewOrderProduct freightOrderProduct = new NewOrderProduct();
  1952. //根据主订单号和运费商品查出订单商品
  1953. List<NewOrderProduct> freightOrderProductList = newOrderProductDao.findFreightOrderProductList(newOrder.getOrderID(), freightProductID);
  1954. for (NewOrderProduct bean : freightOrderProductList) {
  1955. freightShopOrder.setShopOrderID(bean.getShopOrderID());
  1956. freightOrderProduct.setOrderProductID(bean.getOrderProductID());
  1957. newShopOrderDao.delete(freightShopOrder);
  1958. newOrderProductDao.delete(freightOrderProduct);
  1959. }
  1960. if (newOrder.getFreePostFlag() != null && newOrder.getFreePostFlag().equals("1")) {
  1961. setFreightShopOrder(newOrder);
  1962. }
  1963. List<NewShopOrder> shopOrders = newShopOrderDao.findListByOrderID(newOrder.getOrderID());
  1964. String shopOrderIDs = "";
  1965. for (int i = 0; i < shopOrders.size(); i++) {
  1966. if (i == shopOrders.size() - 1) {
  1967. shopOrderIDs = shopOrderIDs + shopOrders.get(i).getShopOrderID();
  1968. } else {
  1969. shopOrderIDs = shopOrderIDs + shopOrders.get(i).getShopOrderID() + ",";
  1970. }
  1971. }
  1972. newOrder.setShopOrderIDs(shopOrderIDs);
  1973. newOrderDao.update(newOrder);
  1974. }
  1975. public NewOrder editDiscountFee(NewOrder newOrder) {
  1976. NewOrder order = newOrderDao.get(String.valueOf(newOrder.getOrderID()));
  1977. return order;
  1978. }
  1979. @Transactional(readOnly = false)
  1980. public void saveDiscountFee(NewOrder newOrder) {
  1981. NewOrder order = newOrderDao.get(String.valueOf(newOrder.getOrderID()));
  1982. newOrder.setPayTotalFee(order.getPayTotalFee() + order.getDiscountFee() - newOrder.getDiscountFee());
  1983. newOrder.setPayableAmount(order.getPayableAmount() + order.getDiscountFee() - newOrder.getDiscountFee());
  1984. newOrder.setDiscountFee(newOrder.getDiscountFee());
  1985. newOrderDao.update(newOrder);
  1986. }
  1987. public Map<String, Object> shopOrderLink(Integer shopOrderId) {
  1988. Map<String, Object> map = new HashMap<>();
  1989. //小程序信息
  1990. String appId = "wxf3cd4ae0cdd11c36";
  1991. String appSecret = "f5707c40c07adf0e2110c58ce6a4f4b3";
  1992. String link = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";
  1993. link = link.replace("APPID", appId).replace("APPSECRET", appSecret);
  1994. String result = "";
  1995. try {
  1996. result = HttpRequest.sendGet(link);
  1997. } catch (Exception e) {
  1998. e.printStackTrace();
  1999. }
  2000. Map<String, Object> objectMap = JSON.parseObject(result, Map.class);
  2001. Integer errcode = (Integer) objectMap.get("errcode");
  2002. if (null != errcode && 0 != errcode) {
  2003. String errmsg = (String) objectMap.get("errmsg");
  2004. map.put("success", false);
  2005. map.put("msg", errmsg);
  2006. }
  2007. String access_token = (String) objectMap.get("access_token");
  2008. String requestUrl = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" + access_token;
  2009. try {
  2010. JSONObject paramJson = new JSONObject();
  2011. paramJson.put("scene", shopOrderId);
  2012. paramJson.put("page", "pages/supplier/login/share-info");
  2013. paramJson.put("width", "280px");
  2014. byte[] bytes = HttpClientUtils.post(requestUrl, paramJson.toJSONString());
  2015. String encode = DatatypeConverter.printBase64Binary(bytes);
  2016. map.put("success", true);
  2017. map.put("imageBuffer", encode);
  2018. } catch (Exception e) {
  2019. e.printStackTrace();
  2020. }
  2021. return map;
  2022. }
  2023. public Map<String, Object> gatheringData(Integer orderId) {
  2024. Map<String, Object> map = new HashMap<>();
  2025. map.put("success", true);
  2026. NewOrder order = newOrderDao.get(orderId.toString());
  2027. //订单金额
  2028. map.put("payTotalFee", order.getPayTotalFee());
  2029. //应付金额
  2030. map.put("payableAmount", order.getPayableAmount());
  2031. //余额抵扣
  2032. map.put("balancePayFee", order.getBalancePayFee());
  2033. //已收款
  2034. double associateAmount = cmDiscernReceiptDao.getAssociateAmount(orderId.toString());
  2035. map.put("associateAmount", associateAmount);
  2036. CmDiscernReceipt cmDiscernReceipt = cmDiscernReceiptDao.findSmoothoutInfo(order.getOrderID().toString());
  2037. if (null != cmDiscernReceipt) {
  2038. //抹平备注
  2039. map.put("balanceAccountsRemark", cmDiscernReceipt.getBalanceAccountsRemark());
  2040. }
  2041. return map;
  2042. }
  2043. @Transactional(readOnly = false)
  2044. public void smoothOutCollection(CmDiscernReceipt discernReceipt) {
  2045. NewOrder order = newOrderDao.get(discernReceipt.getOrderID());
  2046. order.setReceiptStatus("3");
  2047. if ("21".equals(order.getStatus())) {
  2048. order.setStatus("31");
  2049. } else if ("22".equals(order.getStatus())) {
  2050. order.setStatus("32");
  2051. } else {
  2052. order.setStatus("33");
  2053. }
  2054. newOrderDao.update(order);
  2055. CmDiscernReceipt cmDiscernReceipt = cmDiscernReceiptDao.findDiscernReceipt(discernReceipt.getOrderID());
  2056. //已收款金额
  2057. double associateAmount = cmDiscernReceiptDao.getAssociateAmount(discernReceipt.getOrderID());
  2058. if (order.getPayableAmount() > associateAmount) {
  2059. //小额抹平确认
  2060. cmDiscernReceipt.setConfirmType("1");
  2061. } else {
  2062. //大额抹平确认
  2063. cmDiscernReceipt.setConfirmType("2");
  2064. }
  2065. cmDiscernReceipt.setBalanceAccountsRemark(discernReceipt.getBalanceAccountsRemark());
  2066. cmDiscernReceiptDao.update(cmDiscernReceipt);
  2067. }
  2068. @Transactional(readOnly = false)
  2069. public void balanceDeduction(Integer orderID) {
  2070. NewOrder order = newOrderDao.findByOrderID(orderID);
  2071. CmUser user = cmUserDao.get(order.getUserID().toString());
  2072. //已付金额
  2073. Double amountPaid = cmReceiptOrderRelationDao.findPayFeeByOrderID(orderID.toString());
  2074. BigDecimal pendingPayments = MathUtil.sub(order.getPayTotalFee(), amountPaid);
  2075. if (MathUtil.compare(user.getAbleUserMoney(), 0) > 0) {
  2076. //本次余额支付金额
  2077. BigDecimal balancePayFee = BigDecimal.ZERO;
  2078. if (MathUtil.compare(user.getAbleUserMoney(), pendingPayments) < 0) {
  2079. if ("1".equals(order.getSendOutStatus())) {
  2080. order.setStatus("21");
  2081. } else if ("2".equals(order.getSendOutStatus())) {
  2082. order.setStatus("22");
  2083. } else {
  2084. order.setStatus("23");
  2085. }
  2086. order.setReceiptStatus("2");
  2087. balancePayFee = BigDecimal.valueOf(user.getAbleUserMoney());
  2088. } else {
  2089. if (!"0".equals(order.getStatus())) {
  2090. if ("1".equals(order.getSendOutStatus())) {
  2091. order.setStatus("31");
  2092. } else if ("2".equals(order.getSendOutStatus())) {
  2093. order.setStatus("32");
  2094. } else {
  2095. order.setStatus("33");
  2096. }
  2097. }
  2098. order.setReceiptStatus("3");
  2099. balancePayFee = pendingPayments;
  2100. }
  2101. order.setBalancePayFee(MathUtil.add(order.getBalancePayFee(), balancePayFee).doubleValue());
  2102. order.setPayableAmount(MathUtil.sub(order.getPayableAmount(), balancePayFee).doubleValue());
  2103. newOrderDao.update(order);
  2104. //修改账户余额
  2105. user.setUserMoney(MathUtil.sub(user.getUserMoney(), balancePayFee).doubleValue());
  2106. //保存收款记录
  2107. saveDiscernReceipt(balancePayFee.doubleValue(), orderID);
  2108. user.setAbleUserMoney(MathUtil.sub(user.getAbleUserMoney(), balancePayFee).doubleValue());
  2109. cmUserDao.updateMoney(user);
  2110. //保存余额收支记录
  2111. CmUserBalanceRecord cmUserBalanceRecord = new CmUserBalanceRecord();
  2112. cmUserBalanceRecord.setUserId(order.getUserID());
  2113. cmUserBalanceRecord.setType("2");
  2114. cmUserBalanceRecord.setBalanceType("1");
  2115. cmUserBalanceRecord.setAddDate(new Date());
  2116. cmUserBalanceRecord.setAmount(String.valueOf(balancePayFee));
  2117. cmUserBalanceRecord.setOrderId(order.getOrderID());
  2118. cmUserBalanceRecord.setDelFlag("0");
  2119. cmUserBalanceRecordService.insertUserBalanceRecord(cmUserBalanceRecord);
  2120. }
  2121. }
  2122. /**
  2123. * 更新付款状态和0成本标识
  2124. *
  2125. * @param newOrder
  2126. */
  2127. @Transactional(readOnly = false)
  2128. public void updatePayStatus(NewOrder newOrder) {
  2129. newOrderDao.updateOrderStatus(newOrder);
  2130. }
  2131. /**
  2132. * 获取上线协销人员,排除采美默认协销经理
  2133. *
  2134. * @return NewCmSp
  2135. */
  2136. public List<NewCmSp> findServiceProviderList() {
  2137. return newOrderDao.findServiceProviderList();
  2138. }
  2139. @Transactional(readOnly = false)
  2140. public void modifyRebate(Integer orderId) {
  2141. newOrderDao.updateByRebateFlag(orderId);
  2142. }
  2143. public List<LogisticsRecord> qualificationList(Integer logisticsBatchId) {
  2144. List<LogisticsRecord> logisticsRecords = logisticsRecordDao.findByLogisticsBatchID(logisticsBatchId);
  2145. String wwwServer = Global.getConfig("wwwServer");
  2146. logisticsRecords.forEach(item -> {
  2147. item.setImage(AppUtils.getImageURL("product", item.getImage(), 0, wwwServer));
  2148. List<CmFile> fileList = newOrderDao.findQualificationFile(item.getId());
  2149. if (fileList != null && fileList.size() > 0) {
  2150. item.setIsFile(true);
  2151. }
  2152. });
  2153. return logisticsRecords;
  2154. }
  2155. public LogisticsRecord qualificationForm(Integer recordId) {
  2156. LogisticsRecord logisticsRecord = logisticsRecordDao.findByRecordId(recordId);
  2157. List<CmFile> fileList = newOrderDao.findQualificationFile(String.valueOf(recordId));
  2158. logisticsRecord.setFileList(fileList);
  2159. List<String> images = newOrderDao.findQualificationImage(recordId);
  2160. logisticsRecord.setImageList(images);
  2161. return logisticsRecord;
  2162. }
  2163. @Transactional(readOnly = false)
  2164. public void saveQualification(LogisticsRecord logisticsRecord) {
  2165. logisticsRecordDao.updateLogisticsRecord(logisticsRecord);
  2166. //商品资质图片
  2167. String[] images = logisticsRecord.getImages();
  2168. newOrderDao.deleteQualificationImage(logisticsRecord.getRecordId());
  2169. if (images != null && images.length > 0) {
  2170. for (String image : images) {
  2171. if (StringUtils.isNotBlank(image)) {
  2172. image = UploadPicUtils.saveImageToServer(image);
  2173. newOrderDao.insertQualificationImage(logisticsRecord.getRecordId(), image);
  2174. }
  2175. }
  2176. }
  2177. //商品资质文件
  2178. String[] files = logisticsRecord.getFiles();
  2179. newOrderDao.deleteQualificationFile(logisticsRecord.getRecordId());
  2180. if (files != null && files.length > 0) {
  2181. for (String file : files) {
  2182. if (StringUtils.isNotBlank(file)) {
  2183. String[] split = file.split("---");
  2184. String fileName = split[0];
  2185. String ossName = split[1];
  2186. newOrderDao.insertQualificationFile(logisticsRecord.getRecordId(), fileName, ossName);
  2187. }
  2188. }
  2189. }
  2190. }
  2191. public List<LogisticsRecord> qualificationInfo(Integer logisticsBatchId) {
  2192. List<LogisticsRecord> logisticsRecords = logisticsRecordDao.findByLogisticsBatchID(logisticsBatchId);
  2193. String wwwServer = Global.getConfig("wwwServer");
  2194. Iterator<LogisticsRecord> iterator = logisticsRecords.iterator();
  2195. while (iterator.hasNext()) {
  2196. LogisticsRecord item = iterator.next();
  2197. item.setImage(AppUtils.getImageURL("product", item.getImage(), 0, wwwServer));
  2198. List<CmFile> fileList = newOrderDao.findQualificationFile(item.getId());
  2199. item.setFileList(fileList);
  2200. List<String> images = newOrderDao.findQualificationImage(item.getRecordId());
  2201. item.setImageList(images);
  2202. boolean isFile = (fileList == null || fileList.size() == 0);
  2203. boolean isImage = (images == null || images.size() == 0);
  2204. if (StringUtils.isBlank(item.getSn()) && isFile && isImage) {
  2205. iterator.remove();
  2206. }
  2207. }
  2208. return logisticsRecords;
  2209. }
  2210. public Map<String, Object> clubCouponList(Integer userId) {
  2211. Map<String, Object> map = new HashMap<>();
  2212. map.put("code", 0);
  2213. List<CmCoupon> couponList = cmCouponDao.findClubCouponList(userId);
  2214. cmCouponService.setCouponCopywriting(couponList);
  2215. map.put("couponList", couponList);
  2216. return map;
  2217. }
  2218. @Transactional(readOnly = false)
  2219. public Boolean updateClubCoupon(Integer clubCouponId, Integer orderId) {
  2220. CmCoupon coupon = newOrderDao.findClubCouponById(clubCouponId);
  2221. if (coupon == null) {
  2222. return false;
  2223. }
  2224. cmCouponDao.updateClubCoupon(clubCouponId, orderId);
  2225. return true;
  2226. }
  2227. }