NewOrderController.java 114 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273
  1. package com.caimei.modules.order.web;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.caimei.constants.NewPayWay;
  4. import com.caimei.dfs.image.beens.ImageUploadInfo;
  5. import com.caimei.modules.bulkpurchase.entity.BpClause;
  6. import com.caimei.modules.bulkpurchase.entity.CmFinanceCharge;
  7. import com.caimei.modules.bulkpurchase.service.BpClauseService;
  8. import com.caimei.modules.bulkpurchase.service.CmFinanceChargeService;
  9. import com.caimei.modules.bulkpurchase.service.PurchaseProductService;
  10. import com.caimei.modules.common.utils.ExcelUtil;
  11. import com.caimei.modules.common.utils.UploadUtils;
  12. import com.caimei.modules.coupon.entity.CmCouponOrderRecord;
  13. import com.caimei.modules.coupon.service.CmCouponService;
  14. import com.caimei.modules.order.dao.*;
  15. import com.caimei.modules.order.entity.*;
  16. import com.caimei.modules.order.service.*;
  17. import com.caimei.modules.order.utils.OrderUtil;
  18. import com.caimei.modules.product.dao.CmPromotionDao;
  19. import com.caimei.modules.product.dao.ProductDao;
  20. import com.caimei.modules.product.entity.CmPromotion;
  21. import com.caimei.modules.product.entity.Product;
  22. import com.caimei.modules.product.entity.RepeatPurchasePrice;
  23. import com.caimei.modules.product.entity.RepeatPurchasePriceHistory;
  24. import com.caimei.modules.product.service.CmSecondHandDetailService;
  25. import com.caimei.modules.product.service.RepeatPurchasePriceHistoryService;
  26. import com.caimei.modules.product.service.RepeatPurchasePriceService;
  27. import com.caimei.modules.project.dao.ClubDao;
  28. import com.caimei.modules.project.model.ClubModel;
  29. import com.caimei.modules.sys.utils.UploadImageUtils;
  30. import com.caimei.modules.user.dao.CmUserDao;
  31. import com.caimei.modules.user.entity.*;
  32. import com.caimei.modules.user.service.CmMessageService;
  33. import com.caimei.modules.user.service.CmUserOrganizeService;
  34. import com.caimei.modules.user.service.CmUserService;
  35. import com.caimei.modules.user.service.NewCmShopService;
  36. import com.caimei.modules.user.utils.UserType;
  37. import com.caimei.po.ProductLadderPrice;
  38. import com.caimei.utils.AppUtils;
  39. import com.caimei.utils.MathUtil;
  40. import com.caimei.utils.StringUtil;
  41. import com.google.common.collect.Lists;
  42. import com.thinkgem.jeesite.common.config.Global;
  43. import com.thinkgem.jeesite.common.mapper.JsonMapper;
  44. import com.thinkgem.jeesite.common.persistence.Page;
  45. import com.thinkgem.jeesite.common.utils.Encodes;
  46. import com.thinkgem.jeesite.common.utils.StringUtils;
  47. import com.thinkgem.jeesite.common.web.BaseController;
  48. import org.apache.commons.collections.CollectionUtils;
  49. import org.apache.poi.hssf.usermodel.*;
  50. import org.apache.poi.hssf.util.HSSFColor;
  51. import org.apache.poi.ss.usermodel.HorizontalAlignment;
  52. import org.apache.poi.ss.usermodel.VerticalAlignment;
  53. import org.apache.poi.ss.util.CellRangeAddress;
  54. import org.apache.shiro.authz.annotation.RequiresPermissions;
  55. import org.springframework.beans.factory.annotation.Autowired;
  56. import org.springframework.stereotype.Controller;
  57. import org.springframework.ui.Model;
  58. import org.springframework.web.bind.annotation.*;
  59. import org.springframework.web.servlet.mvc.support.RedirectAttributes;
  60. import javax.annotation.Resource;
  61. import javax.servlet.http.HttpServletRequest;
  62. import javax.servlet.http.HttpServletResponse;
  63. import java.io.ByteArrayOutputStream;
  64. import java.math.BigDecimal;
  65. import java.text.SimpleDateFormat;
  66. import java.util.*;
  67. import java.util.stream.IntStream;
  68. /**
  69. * 订单模块重构-订单Controller
  70. *
  71. * @author lwt
  72. * @version 2018-07-23
  73. */
  74. @Controller
  75. @RequestMapping(value = "${adminPath}/order")
  76. public class NewOrderController extends BaseController {
  77. @Resource
  78. private CmUtilsDao cmUtilsDao;
  79. @Resource
  80. private NewOrderService newOrderService;
  81. @Resource
  82. private BpClauseService bpClauseService;
  83. @Resource
  84. private NewOrderProductService newOrderProductService;
  85. @Autowired
  86. private NewReceiptListService newReceiptListService;
  87. @Resource
  88. private NewShopOrderService newShopOrderService;
  89. @Resource
  90. private CmFinanceChargeService cmFinanceChargeService;
  91. @Resource
  92. private OrderUserInfoService orderUserInfoService;
  93. @Resource
  94. private CmMessageService cmMessageService;
  95. @Resource
  96. private ClubDao clubDao;
  97. @Autowired
  98. private ProductDao productDao;
  99. @Resource
  100. private CmProductSnService cmProductSnService;
  101. @Autowired
  102. private NewOrderProductDao newOrderProductDao;
  103. @Resource
  104. private CmReturnedPurchaseDao cmReturnedPurchaseDao;
  105. @Resource
  106. private CmUserService cmUserService;
  107. @Resource
  108. private RepeatPurchasePriceService repeatPurchasePriceService;
  109. @Resource
  110. private NewCmShopService newCmShopService;
  111. @Resource
  112. private RepeatPurchasePriceHistoryService repeatPurchasePriceHistoryService;
  113. @Resource
  114. private NewOrderConfigService newOrderConfigService;
  115. @Resource
  116. private CmDiscernReceiptService cmDiscernReceiptService;
  117. @Resource
  118. private CmUserDao cmUserDao;
  119. @Resource
  120. private CmReturnedPurchaseService cmReturnedPurchaseService;
  121. @Resource
  122. private CmReceiptOrderRelationDao cmReceiptOrderRelationDao;
  123. @Autowired
  124. private CmUserOrganizeService cmUserOrganizeService;
  125. @Autowired
  126. private CmSecondHandDetailService cmSecondHandDetailService;
  127. @Autowired
  128. private CmDiscernReceiptDao cmDiscernReceiptDao;
  129. @Autowired
  130. private CmReceiptOrderRelationService cmReceiptOrderRelationService;
  131. @Resource
  132. private CmPromotionDao cmPromotionDao;
  133. @Autowired
  134. private PurchaseProductService purchaseProductService;
  135. @Autowired
  136. private CmCouponService cmCouponService;
  137. @ModelAttribute
  138. public NewOrder get(@RequestParam(required = false) String id) {
  139. NewOrder entity = null;
  140. if (StringUtils.isNotBlank(id)) {
  141. entity = newOrderService.get(id);
  142. }
  143. if (entity == null) {
  144. entity = new NewOrder();
  145. }
  146. return entity;
  147. }
  148. @RequiresPermissions("order:order:view")
  149. @RequestMapping("orderList")
  150. public String orderList(NewOrder order, HttpServletRequest request, HttpServletResponse response, Model model) {
  151. if (null != order.getStartTime() && !"".equals(order.getStartTime()) && !order.getStartTime().endsWith("00:00:00")) {
  152. model.addAttribute("startTime", order.getStartTime());
  153. order.setStartTime(order.getStartTime().trim() + " 00:00:00");
  154. }
  155. if (null != order.getEndTime() && !"".equals(order.getEndTime()) && !order.getEndTime().endsWith("23:59:59")) {
  156. model.addAttribute("endTime", order.getEndTime());
  157. order.setEndTime(order.getEndTime().trim() + " 23:59:59");
  158. }
  159. if (null != order.getStartConfirmTime() && !"".equals(order.getStartConfirmTime()) && !order.getStartConfirmTime().endsWith("00:00:00")) {
  160. model.addAttribute("startConfirmTime", order.getStartConfirmTime());
  161. order.setStartConfirmTime(order.getStartConfirmTime().trim() + " 00:00:00");
  162. }
  163. if (null != order.getEndConfirmTime() && !"".equals(order.getEndConfirmTime()) && !order.getEndConfirmTime().endsWith("23:59:59")) {
  164. model.addAttribute("endConfirmTime", order.getEndConfirmTime());
  165. order.setEndConfirmTime(order.getEndConfirmTime().trim() + " 23:59:59");
  166. }
  167. if (null != order.getStartRefundTime() && !"".equals(order.getStartRefundTime()) && !order.getStartRefundTime().endsWith("00:00:00")) {
  168. model.addAttribute("startRefundTime", order.getStartRefundTime());
  169. order.setStartRefundTime(order.getStartRefundTime().trim() + " 00:00:00");
  170. }
  171. if (null != order.getEndRefundTime() && !"".equals(order.getEndRefundTime()) && !order.getEndRefundTime().endsWith("23:59:59")) {
  172. model.addAttribute("endRefundTime", order.getEndRefundTime());
  173. order.setEndRefundTime(order.getEndRefundTime().trim() + " 23:59:59");
  174. }
  175. model.addAttribute("orderRefundType", order.getOrderRefundType());
  176. if (null != order.getBuyer()) {
  177. order.setBuyer(order.getBuyer().trim());
  178. }
  179. if (null != order.getReceiver()) {
  180. order.setReceiver(order.getReceiver().trim());
  181. }
  182. //查询内部处理了已收,未付统计(包含运费)
  183. Page<NewOrder> page = newOrderService.findPage(new Page<>(request, response, 20), order);
  184. //获取组织列表
  185. List<CmUserOrganize> cmUserOrganizeList = cmUserOrganizeService.findOrganize();
  186. model.addAttribute("cmUserOrganizeList", cmUserOrganizeList);
  187. //获取上线协销人员,排除采美默认协销经理
  188. List<NewCmSp> serviceProviderList = newOrderService.findServiceProviderList();
  189. model.addAttribute("serviceProviderList", serviceProviderList);
  190. model.addAttribute("page", page);
  191. return "modules/order/newOrderList";
  192. }
  193. @RequiresPermissions("order:order:secondhandOrder")
  194. @RequestMapping("secondhandOrderList")
  195. public String secondhandOrderList(NewOrder order, HttpServletRequest request, HttpServletResponse response, Model model) {
  196. if (null != order.getStartTime() && !"".equals(order.getStartTime()) && !order.getStartTime().endsWith("00:00:00")) {
  197. model.addAttribute("startTime", order.getStartTime());
  198. order.setStartTime(order.getStartTime().trim() + " 00:00:00");
  199. }
  200. if (null != order.getEndTime() && !"".equals(order.getEndTime()) && !order.getEndTime().endsWith("23:59:59")) {
  201. model.addAttribute("endTime", order.getEndTime());
  202. order.setEndTime(order.getEndTime().trim() + " 23:59:59");
  203. }
  204. if (null != order.getStartConfirmTime() && !"".equals(order.getStartConfirmTime()) && !order.getStartConfirmTime().endsWith("00:00:00")) {
  205. model.addAttribute("startConfirmTime", order.getStartConfirmTime());
  206. order.setStartConfirmTime(order.getStartConfirmTime().trim() + " 00:00:00");
  207. }
  208. if (null != order.getEndConfirmTime() && !"".equals(order.getEndConfirmTime()) && !order.getEndConfirmTime().endsWith("23:59:59")) {
  209. model.addAttribute("endConfirmTime", order.getEndConfirmTime());
  210. order.setEndConfirmTime(order.getEndConfirmTime().trim() + " 23:59:59");
  211. }
  212. if (null != order.getStartRefundTime() && !"".equals(order.getStartRefundTime()) && !order.getStartRefundTime().endsWith("00:00:00")) {
  213. model.addAttribute("startRefundTime", order.getStartRefundTime());
  214. order.setStartRefundTime(order.getStartRefundTime().trim() + " 00:00:00");
  215. }
  216. if (null != order.getEndRefundTime() && !"".equals(order.getEndRefundTime()) && !order.getEndRefundTime().endsWith("23:59:59")) {
  217. model.addAttribute("endRefundTime", order.getEndRefundTime());
  218. order.setEndRefundTime(order.getEndRefundTime().trim() + " 23:59:59");
  219. }
  220. model.addAttribute("orderRefundType", order.getOrderRefundType());
  221. if (null != order.getBuyer()) {
  222. order.setBuyer(order.getBuyer().trim());
  223. }
  224. if (null != order.getReceiver()) {
  225. order.setReceiver(order.getReceiver().trim());
  226. }
  227. order.setProductCategory(2);
  228. //查询内部处理了已收,未付统计(包含运费)
  229. Page<NewOrder> page = newOrderService.findPage(new Page<>(request, response, 20), order);
  230. //获取组织列表
  231. List<CmUserOrganize> cmUserOrganizeList = cmUserOrganizeService.findOrganize();
  232. model.addAttribute("cmUserOrganizeList", cmUserOrganizeList);
  233. //获取上线协销人员,排除采美默认协销经理
  234. List<NewCmSp> serviceProviderList = newOrderService.findServiceProviderList();
  235. model.addAttribute("serviceProviderList", serviceProviderList);
  236. model.addAttribute("page", page);
  237. return "modules/order/secondhandOrderList";
  238. }
  239. @RequiresPermissions("order:order:form")
  240. @RequestMapping(value = "form")
  241. public String form(NewOrder newOrder, Model model, HttpServletRequest request) {
  242. BpClause bpClause = new BpClause();
  243. bpClause.setEnabledStatus("1");
  244. List<BpClause> bpClauses = bpClauseService.findList(bpClause);
  245. model.addAttribute("bpClauses", bpClauses);
  246. if (null != newOrder.getClauseID() && StringUtils.equals("1", newOrder.getConfirmFlag())) {//订单,且确认
  247. BpClause bpClause1 = bpClauseService.get(newOrder.getClauseID().toString());
  248. model.addAttribute("bpClause", bpClause1);
  249. }
  250. if (null != newOrder) {
  251. //根据订单产品
  252. List<NewOrderProduct> orderProducts = newOrder.getOrderProduct();
  253. if (null != orderProducts && orderProducts.size() > 0) {
  254. BigDecimal alreadyShopOtherPay = new BigDecimal(0);
  255. for (NewOrderProduct orderProduct : orderProducts) {
  256. //重新赋值
  257. alreadyShopOtherPay = BigDecimal.ZERO;
  258. orderProduct.setShopFeeFlag("0");
  259. //获取订单商品的应付信息
  260. List<CmFinanceCharge> cmFinanceCharges = cmFinanceChargeService.findListByProductId(orderProduct.getId());
  261. if (null != cmFinanceCharges && cmFinanceCharges.size() > 0) {
  262. for (int i = 0; i < cmFinanceCharges.size(); i++) { //一个产品多个出账记录
  263. if ("3".equals(cmFinanceCharges.get(i).getStatus())) {
  264. alreadyShopOtherPay = MathUtil.add(alreadyShopOtherPay, cmFinanceCharges.get(i).getShopFee());//已审核通过付给供应商金额
  265. }
  266. }
  267. } else {
  268. orderProduct.setShopFeeFlag("0");//没有 则可以修改应付供应商
  269. }
  270. //金额不为空 且 金额相等
  271. if (BigDecimal.valueOf(orderProduct.getShopFee()).compareTo(alreadyShopOtherPay) == 0 && alreadyShopOtherPay.compareTo(BigDecimal.ZERO) != 0) {
  272. orderProduct.setShopFeeFlag("1");//审核通过 不可修改
  273. }
  274. // 促销
  275. CmPromotion orderPromotions = null;
  276. if (null != orderProduct.getOrderPromotionsId()) {
  277. orderPromotions = cmPromotionDao.findOrderPromotions(orderProduct.getOrderPromotionsId());
  278. if (null != orderPromotions) {
  279. orderProduct.setPromotionsId(orderPromotions.getPromotionsId());
  280. orderProduct.setLadderPriceFlag(0);
  281. }
  282. }
  283. Product product = productDao.get(orderProduct.getProductID().toString());
  284. orderProduct.setCommodityType(product.getCommodityType());
  285. if (null == orderPromotions) {
  286. if (1 == orderProduct.getLadderPriceFlag() && "1".equals(product.getLadderPriceFlag())) {
  287. // 查询商品当前阶梯价格
  288. List<ProductLadderPrice> ladderPriceList = purchaseProductService.findLadderPriceList(orderProduct.getProductID().longValue());
  289. if (null != ladderPriceList && ladderPriceList.size() > 0) {
  290. IntStream.range(0, ladderPriceList.size()).forEach(i -> {
  291. if (i == ladderPriceList.size() - 1) {
  292. ladderPriceList.get(i).setBuyNumRangeShow("≥" + ladderPriceList.get(i).getBuyNum());
  293. } else {
  294. String buyNumRangeShow = ladderPriceList.get(i).getBuyNum() + "~" + (ladderPriceList.get(i + 1).getBuyNum() - 1);
  295. ladderPriceList.get(i).setBuyNumRangeShow(buyNumRangeShow);
  296. }
  297. });
  298. orderProduct.setLadderPriceList(ladderPriceList);
  299. }
  300. } else {
  301. orderProduct.setLadderPriceFlag(0);
  302. orderProduct.setIsActProduct("0");
  303. }
  304. }
  305. //是否有优惠券可以查看
  306. Boolean couponsLogo = cmCouponService.setCouponsLogo(newOrder.getUserID(), orderProduct.getProductID(), orderProduct.getShopID(), product.getCommodityType());
  307. if (couponsLogo) {
  308. orderProduct.setCouponsLogo(2);
  309. } else {
  310. orderProduct.setCouponsLogo(1);
  311. }
  312. }
  313. }
  314. if (null != newOrder.getOrderID() && null != newOrder.getClauseName()) {
  315. newOrderService.updateClauseContent(newOrder);
  316. }
  317. if (StringUtil.isEmpty(newOrder.getOrderTime())) {
  318. newOrder.setOrderTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
  319. }
  320. if (null == newOrder.getOrderID()) {
  321. newOrder.setOrderSource("4");
  322. }
  323. }
  324. model.addAttribute("order", newOrder);
  325. return "modules/order/orderForm";
  326. }
  327. @RequiresPermissions("order:order:secondeProductOrderForm")
  328. @RequestMapping(value = "secondeProductOrderForm")
  329. public String secondeProductOrderForm(NewOrder newOrder, Model model, HttpServletRequest request) {
  330. BpClause bpClause = new BpClause();
  331. bpClause.setEnabledStatus("1");
  332. List<BpClause> bpClauses = bpClauseService.findList(bpClause);
  333. model.addAttribute("bpClauses", bpClauses);
  334. if (null != newOrder.getClauseID() && StringUtils.equals("1", newOrder.getConfirmFlag())) {//订单,且确认
  335. BpClause bpClause1 = bpClauseService.get(newOrder.getClauseID().toString());
  336. model.addAttribute("bpClause", bpClause1);
  337. }
  338. if (null != newOrder) {
  339. //根据订单产品
  340. List<NewOrderProduct> orderProducts = newOrder.getOrderProduct();
  341. if (null != orderProducts && orderProducts.size() > 0) {
  342. BigDecimal alreadyShopOtherPay = new BigDecimal(0);
  343. for (NewOrderProduct orderProduct : orderProducts) {
  344. //重新赋值
  345. alreadyShopOtherPay = BigDecimal.ZERO;
  346. orderProduct.setShopFeeFlag("0");
  347. //获取订单商品的应付信息
  348. List<CmFinanceCharge> cmFinanceCharges = cmFinanceChargeService.findListByProductId(orderProduct.getId());
  349. if (null != cmFinanceCharges && cmFinanceCharges.size() > 0) {
  350. for (int i = 0; i < cmFinanceCharges.size(); i++) { //一个产品多个出账记录
  351. if ("3".equals(cmFinanceCharges.get(i).getStatus())) {
  352. alreadyShopOtherPay = MathUtil.add(alreadyShopOtherPay, cmFinanceCharges.get(i).getShopFee());//已审核通过付给供应商金额
  353. }
  354. }
  355. } else {
  356. orderProduct.setShopFeeFlag("0");//没有 则可以修改应付供应商
  357. }
  358. //金额不为空 且 金额相等
  359. if (new BigDecimal(orderProduct.getShopFee()).compareTo(alreadyShopOtherPay) == 0 && alreadyShopOtherPay.compareTo(BigDecimal.ZERO) != 0) {
  360. orderProduct.setShopFeeFlag("1");//审核通过 不可修改
  361. }
  362. }
  363. }
  364. if (null != newOrder.getOrderID() && null != newOrder.getClauseName()) {
  365. newOrderService.updateClauseContent(newOrder);
  366. }
  367. if (StringUtil.isEmpty(newOrder.getOrderTime())) {
  368. newOrder.setOrderTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
  369. }
  370. }
  371. model.addAttribute("order", newOrder);
  372. return "modules/order/secondProductOrderForm";
  373. }
  374. @RequiresPermissions("order:order:edit")
  375. @RequestMapping(value = "save")
  376. public String save(NewOrder newOrder, Model model, RedirectAttributes redirectAttributes, HttpServletRequest request) {
  377. // 是否为二手订单(二手订单只存在一个商品)
  378. boolean isSecondHandOrder = false;
  379. if (!beanValidator(model, newOrder)) {
  380. return form(newOrder, model, request);
  381. }
  382. if (CollectionUtils.isEmpty(newOrder.getOrderProduct())) {
  383. model.addAttribute("message", "保存失败商品不能为空");
  384. return form(newOrder, model, request);
  385. } else {
  386. List<NewOrderProduct> orderProductList = Lists.newArrayList();
  387. for (NewOrderProduct newOrderProduct : newOrder.getOrderProduct()) {
  388. if (StringUtils.isNotEmpty(newOrderProduct.getEnabledStatus())) {
  389. NewOrderProduct o = (NewOrderProduct) JsonMapper.fromJsonString(newOrderProduct.getEnabledStatus(), NewOrderProduct.class);
  390. JSONObject jsonObject = JSONObject.parseObject(newOrderProduct.getEnabledStatus());
  391. String productId = jsonObject.getString("productId");
  392. if (productId != null && !"".equals(productId)) {
  393. o.setProductID(Integer.valueOf(productId));
  394. }
  395. String shopId = jsonObject.getString("shopId");
  396. if (shopId != null && !"".equals(shopId)) {
  397. o.setShopID(Integer.valueOf(shopId));
  398. }
  399. String singleShopFee = jsonObject.getString("shopFee1");
  400. if (singleShopFee != null && !"".equals(singleShopFee)) {
  401. o.setSingleShopFee(Double.valueOf(singleShopFee));
  402. }
  403. String singleOtherFee = jsonObject.getString("otherFee1");
  404. if (singleOtherFee != null && !"".equals(singleOtherFee)) {
  405. o.setSingleOtherFee(Double.valueOf(singleOtherFee));
  406. }
  407. String singleCmFee = jsonObject.getString("cmFee1");
  408. if (singleCmFee != null && !"".equals(singleCmFee)) {
  409. o.setSingleCmFee(Double.valueOf(singleCmFee));
  410. }
  411. String productType = jsonObject.getString("productType");
  412. if (productType != null && !"".equals(productType)) {
  413. o.setProductType(Integer.valueOf(productType));
  414. }
  415. String ladderPriceFlag = jsonObject.getString("ladderPriceFlag");
  416. if (ladderPriceFlag != null && !"".equals(ladderPriceFlag)) {
  417. o.setLadderPriceFlag(Integer.valueOf(ladderPriceFlag));
  418. }
  419. if (null == o.getPrice()) {
  420. Double price = newOrderProductDao.findPriceBySku(jsonObject.getString("skuId"));
  421. o.setPrice(price);
  422. }
  423. o.setSkuID(Integer.valueOf(jsonObject.getString("skuId")));
  424. o.setSplitCode(productDao.getSplitCodeByProductId(o.getProductID()));
  425. if ("0".equals(productType)) {
  426. o.setPreferential((o.getPrice() - o.getDiscountPrice()) * o.getNum());//折扣
  427. o.setDiscountFee(BigDecimal.valueOf(o.getTotalFee()).subtract(BigDecimal.valueOf(o.getShouldPayFee())).doubleValue());//经理折扣
  428. o.setTotalAmount(o.getPrice() * o.getNum());//商品总金额
  429. //设置订单商品的默认应付税费(只有默认的时候应付税费才等于应收税费)
  430. if (o.getShouldPayTotalTax() == null) {
  431. o.setSingleShouldPayTotalTax(o.getAddedValueTax());
  432. o.setShouldPayTotalTax(o.getTotalAddedValueTax());
  433. }
  434. } else {
  435. o.setPreferential(0d);
  436. o.setDiscount(100d);
  437. o.setDiscountFee(0d);
  438. o.setTotalAmount(0d);
  439. o.setShouldPayFee(0d);
  440. o.setSingleShouldPayTotalTax(0d);
  441. o.setShouldPayTotalTax(0d);
  442. o.setCmFee(0d);
  443. o.setTotalFee(0d);
  444. o.setTotalAddedValueTax(0d);
  445. o.setAddedValueTax(0d);
  446. o.setTaxRate(0d);
  447. }
  448. o.setPresentNum(0);
  449. o.setNotOutStore(o.getNum());
  450. o.setStatus(0);//订单商品待付款
  451. if (o.getPayStatus() == null) {
  452. o.setPayStatus("0"); //默认值为未付款(0 未进账 1 待财务审核 2 已进账)
  453. }
  454. Integer promotionsId = o.getPromotionsId() != null ? o.getPromotionsId() : 0;
  455. o.setPromotionsId(promotionsId);
  456. orderProductList.add(o);
  457. String productCategory = o.getProductCategory();
  458. if (StringUtils.equals(productCategory, "2")) {
  459. isSecondHandOrder = true;
  460. }
  461. }
  462. }
  463. if (CollectionUtils.isNotEmpty(orderProductList)) {
  464. newOrder.setOrderProduct(orderProductList);
  465. }
  466. }
  467. Date date = new Date();
  468. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  469. String time = sdf.format(date);
  470. if (isSecondHandOrder) {
  471. newOrder.setSecondHandOrderFlag("1");
  472. } else {
  473. newOrder.setSecondHandOrderFlag("0");
  474. }
  475. //后台添加订单状态为0;待确认
  476. if (StringUtils.isEmpty(newOrder.getStatus())) {
  477. newOrder.setStatus("0");
  478. }
  479. if (newOrder.getPayableAmount() == 0 && newOrder.getPayTotalFee() == 0) {
  480. // 订单状态
  481. newOrder.setStatus("31");
  482. newOrder.setReceiptStatus("3");
  483. newOrder.setPayFlag("1");
  484. newOrder.setConfirmFlag("1");//标记为确认订单
  485. newOrder.setConfirmTime(time);
  486. }
  487. //后台添加订单订单提交类型;后台提交4
  488. if (StringUtils.isEmpty(newOrder.getOrderSubmitType())) {
  489. newOrder.setOrderSubmitType("4");
  490. }
  491. //如果是[5:外单]类型则订单状态直接为交易完成
  492. if (StringUtils.equals("5", newOrder.getOrderSource())) {
  493. newOrder.setConfirmFlag("1");//标记为确认订单
  494. newOrder.setConfirmTime(time);
  495. }
  496. if (StringUtils.equals("1", newOrder.getCooFreeFlag())) {
  497. //如果是分期订单
  498. newOrder.setCooFreeFlag("0");
  499. newOrder.setCooFreeRate(0);
  500. newOrder.setCooFreeAmount(0.00d);
  501. }
  502. if (newOrder.getOrderID() == null) {
  503. // lwt 订单的下单时间和单号 都再订单保存后再展示
  504. newOrder.setOrderNo(OrderUtil.geneAdminOrderNo());
  505. newOrder.setOrderType("0"); // 订单类型 协销订单 0 普通订单 1
  506. newOrder.setOrderSubmitType("4");
  507. newOrder.setSplitFlag("1"); //订单可拆分
  508. }
  509. if (newOrder.getClauseID() == null) {
  510. newOrder.setClauseID(1); //没有选择条款的话 默认就是无条款
  511. }
  512. BpClause clause = bpClauseService.get(newOrder.getClauseID().toString());
  513. newOrder.setClauseContent(clause.getContent());
  514. newOrder.setClauseName(clause.getName());
  515. //保存订单
  516. newOrderService.save(newOrder);
  517. if (newOrder.getOrderID() != null) {
  518. //订单重新保存后则修改订单商品需供应商确认
  519. newOrderProductService.updateShopConfigFlag(newOrder.getOrderID());
  520. }
  521. addMessage(redirectAttributes, "保存订单成功");
  522. if ("1".equals(newOrder.getSecondHandOrderFlag())) {
  523. return "redirect:" + Global.getAdminPath() + "/order/secondhandOrderList";
  524. } else {
  525. return "redirect:" + Global.getAdminPath() + "/order/orderList";
  526. }
  527. }
  528. @RequiresPermissions("order:order:edit")
  529. @RequestMapping("printOrder")
  530. public String printOrder(Integer orderID, Integer shopOrderID, Model model) {
  531. if (shopOrderID != null) {
  532. NewShopOrder shopOrder = newShopOrderService.findByShopOrderID(shopOrderID);
  533. NewOrder order = newOrderService.findByOrderID(shopOrder.getOrderID());
  534. String payWay = order.getPayWay();
  535. if (payWay != null) {
  536. for (NewPayWay type : NewPayWay.values()) {
  537. if (payWay.contains(type.getCode() + ""))
  538. payWay = payWay.replaceAll(type.getCode() + "", type.getDesc());
  539. }
  540. order.setPayWay(payWay);
  541. } else {
  542. order.setPayWay("-");
  543. }
  544. OrderUserInfo orderUserInfo = orderUserInfoService.findByOrderID(order.getOrderID());
  545. model.addAttribute("shopOrder", shopOrder);
  546. model.addAttribute("order", order);
  547. model.addAttribute("orderUserInfo", orderUserInfo);
  548. return "modules/order/printSubOrder";
  549. }
  550. if (orderID != null) {
  551. NewOrder order = newOrderService.get(orderID + "");
  552. order.getOrderProduct().forEach(o -> {
  553. if (o.getOrderPromotionsId() != null) {
  554. CmPromotion promotions = cmPromotionDao.findOrderPromotions(o.getOrderPromotionsId());
  555. if (promotions != null && "1".equals(promotions.getMode())) {
  556. o.setDiscountPrice(promotions.getTouchPrice());
  557. }
  558. }
  559. });
  560. order.getNewShopOrders().removeIf(so -> so.getPostFeeCos().equals("1"));
  561. model.addAttribute("order", order);
  562. return "modules/order/printOrder";
  563. }
  564. return "modules/order/printOrder";
  565. }
  566. /**
  567. * 普通订单商品修改
  568. *
  569. * @param model
  570. * @return
  571. */
  572. @RequiresPermissions("order:order:edit")
  573. @RequestMapping("modifyProduct")
  574. public String modifyProduct(Model model, Integer orderID) {
  575. NewOrder order = newOrderService.get(orderID.toString());
  576. model.addAttribute("order", order);
  577. return "modules/order/modifyProduct";
  578. }
  579. /**
  580. * 协销订单确认
  581. *
  582. * @param model
  583. * @return
  584. */
  585. @RequiresPermissions("order:order:confirmOrder")
  586. @RequestMapping("confirmOrder")
  587. public String confirmOrder(Integer orderID, Model model, RedirectAttributes redirectAttributes) {
  588. NewOrder order = newOrderService.get(orderID + "");
  589. if (StringUtils.isNotEmpty(order.getStatus()) && Integer.parseInt(order.getStatus()) > 0) {
  590. addMessage(redirectAttributes, "订单状态异常,请刷新后重试!");
  591. return "redirect:" + Global.getAdminPath() + "/order/detail/?id=" + orderID;
  592. }
  593. //优惠券确认消耗
  594. CmCouponOrderRecord orderRecord = order.getCouponOrderRecord();
  595. if (order.getCouponAmount() > 0 && orderRecord != null) {
  596. Boolean isCoupon = newOrderService.updateClubCoupon(orderRecord.getClubCouponId(), orderID);
  597. if (!isCoupon) {
  598. addMessage(redirectAttributes, "订单内优惠券已被使用");
  599. return "redirect:" + Global.getAdminPath() + "/order/detail/?id=" + orderID;
  600. }
  601. }
  602. //————————————————————————————-----
  603. //确认订单时处理买家商品价格库信息
  604. final Integer userID;
  605. if ("6".equals(order.getOrderSubmitType())) {
  606. userID = order.getUserID();
  607. } else {
  608. Integer clubId = order.getClubID();
  609. ClubModel clubByUserId = clubDao.getClubByUserId(Integer.parseInt(clubId.toString()));
  610. userID = clubByUserId.getUserID();
  611. }
  612. List<NewOrderProduct> orderProduct = order.getOrderProduct();
  613. if (CollectionUtils.isNotEmpty(orderProduct) && orderProduct.size() > 0) {
  614. for (NewOrderProduct op : orderProduct) {
  615. String isActProduct = op.getIsActProduct();
  616. Integer svipPriceFlag = op.getSvipPriceFlag();
  617. Integer ladderPriceFlag = op.getLadderPriceFlag();
  618. //活动商品和阶梯商品和超级会员价不写入价格库
  619. if (StringUtil.equals("0", isActProduct) && 0 == svipPriceFlag && 0 == ladderPriceFlag) {
  620. String buyAgainFlag = op.getBuyAgainFlag();
  621. //对于可以复购的商品添加买家商品价格,提供再次购买商品使用(如果不存在没有改买家商品价格则不能购买该商品)
  622. if (StringUtils.isNotEmpty(buyAgainFlag) && StringUtils.equals("1", buyAgainFlag)) {
  623. Product product = productDao.get(op.getProductID().toString());
  624. if (null != product) {
  625. String costPrice = product.getCostPrice();//成本价
  626. //version 4.6.0 写入复购价格库
  627. Double buyPrice = op.getDiscountPrice(); //该商品的购买价
  628. // Date now = new Date();
  629. //// Date begin = product.getBeginTime();
  630. //// Date end = product.getEndTime();
  631. CmUser u = cmUserService.get(userID + "");
  632. // if ("1".equals(product.getLadderPriceFlag()) ||
  633. // ("1".equals(product.getActFlag()) &&
  634. // "1001".equals(product.getActType()) /*&&
  635. // new Date().after(begin) && now.before(end)*/)) {
  636. // //如果商品启用了阶梯价格或者团购活动,那么不使用购买价格而是用用户对应身份的非活动价格参与复购价格库计算
  637. // //确认用户类型
  638. // Integer userType = 1;//查看价格用户类型(1:游客,2:普通用户,3:会员)
  639. // if ("10".equals(u.getRegisterUserTypeID())) {//普通用户或者游客
  640. // boolean isVisitor = newOrderService.isVisitor(userID.toString());//是否是游客
  641. // if (isVisitor) {
  642. // userType = 1;
  643. // buyPrice = product.getPrice().doubleValue();
  644. // } else {
  645. // userType = 2;
  646. // buyPrice = product.getPrice().doubleValue();
  647. // }
  648. // } else {
  649. // //未冻结 上线会所 上线创客查看会员价
  650. // if (AppKeys.FLAG_YES.equals(u.getValidFlag()) &&
  651. // (UserType.isClub(u.getRegisterUserTypeID())
  652. // && (StringUtils.isNotEmpty(u.getClubStatus()) &&
  653. // ("40".equals(u.getClubStatus()) || "90".equals(u.getClubStatus())))
  654. // )) {
  655. // userType = 3;
  656. // buyPrice = product.getPrice1().doubleValue();
  657. // }
  658. // //普通用户 非上线创客会所 供应商 已冻结用户 展示普通价
  659. // else {
  660. // userType = 2;
  661. // buyPrice = product.getPrice0().doubleValue();
  662. // }
  663. // }
  664. // }
  665. Integer clubID = null;
  666. Integer uID = null;
  667. if (UserType.isClub(u.getRegisterUserTypeID())) {
  668. clubID = StringUtils.isEmpty(u.getClubID()) ? null : Integer.valueOf(u.getClubID());
  669. } else {
  670. uID = u.getUserID();
  671. }
  672. // 当前购买价格与成本价比较
  673. String costCheckFlag = product.getCostCheckFlag();//成本价选中标志:1固定成本 2比例成本
  674. if ("2".equals(costCheckFlag)) {
  675. costPrice = MathUtil.div(MathUtil.mul(product.getPrice(), product.getCostProportional()), 100).toString();
  676. if ("0".equals(costPrice)) costPrice = op.getCostPrice().toString();
  677. }
  678. //购买价大于成本价,采美赚钱 就写入复购价格库
  679. SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  680. String strDate = formatter.format(new Date());
  681. String flag = "0";
  682. if (StringUtils.isNotBlank(costPrice) && buyPrice > Double.valueOf(costPrice)) {
  683. // 查询复购价格库 比较复购价格库中的购买价格与这一次的购买价格
  684. RepeatPurchasePrice p = repeatPurchasePriceService.getLastBuyPrice(clubID, uID, product.getProductID());
  685. if (p == null) {
  686. NewCmShop shop = newCmShopService.get(product.getShopID().toString());
  687. p = new RepeatPurchasePrice();
  688. p.setClubId(clubID);
  689. p.setUserId(u.getUserID());
  690. p.setCurrentPrice(buyPrice.toString());
  691. p.setCreateTime(strDate);
  692. p.setProductId(product.getProductID());
  693. p.setOrderId(orderID.toString());
  694. p.setShopId(shop == null ? null : shop.getShopID());
  695. p.setShopName(shop == null ? "" : shop.getName());
  696. p.setTaxRate(String.valueOf(op.getTaxRate()));
  697. repeatPurchasePriceService.insert(p);
  698. } else if (StringUtils.isNotBlank(p.getCurrentPrice()) && buyPrice < Double.valueOf(p.getCurrentPrice())) { // 这一次的购买价格小于复购价格库中的价格
  699. p.setCurrentPrice(buyPrice.toString());
  700. p.setOrderId(orderID.toString());
  701. p.setTaxRate(String.valueOf(op.getTaxRate()));
  702. repeatPurchasePriceService.update(p);
  703. }
  704. flag = "1";
  705. }
  706. RepeatPurchasePriceHistory r = new RepeatPurchasePriceHistory();
  707. r.setClubId(clubID);
  708. r.setUserId(u.getUserID());
  709. r.setPrice(buyPrice.toString());
  710. r.setOrderId(orderID);
  711. r.setCurrentCostPrice(costPrice);
  712. r.setCreateTime(strDate);
  713. r.setProductId(product.getProductID());
  714. r.setValid(flag);
  715. repeatPurchasePriceHistoryService.insert(r);
  716. }
  717. }
  718. }
  719. // 二手商品确认商品如果是二手仪器则需要把该二手商品置为已售
  720. if (StringUtils.equals(op.getSecondHandType(), "1") && StringUtils.equals("2", op.getProductCategory())) {
  721. cmSecondHandDetailService.updatSecondHnadproductSold(op.getProductID());
  722. }
  723. }
  724. }
  725. //————————————————————————————-----
  726. CmMessage msg = new CmMessage();
  727. msg.setAddTime(com.caimei.utils.DateUtils.getDateTime());
  728. msg.setContent("您有一笔订单等待支付,快去订单列表进行支付。");
  729. msg.setTitle("订单确认结果");
  730. msg.setToUserID(order.getUserID());
  731. msg.setMessageTypeID("1");
  732. msg.setReadFlag("0");
  733. cmMessageService.save(msg);
  734. newOrderService.confirmOrder(orderID);
  735. //确认订单的时候将用户余额修改为抵扣之后金额(协销下单,后台下单--待确认订单)注意用户自己下单的时候直接则两个金额同时减少,取消同时回滚
  736. Double balancePayFee = order.getBalancePayFee();
  737. CmUser u = cmUserService.get(userID + "");
  738. if (null != u && null != balancePayFee) {
  739. Double userMoney = u.getUserMoney();
  740. if (null != userMoney) {
  741. u.setUserMoney(userMoney - balancePayFee);
  742. cmUserDao.updateMoney(u);
  743. }
  744. }
  745. addMessage(redirectAttributes, "确认订单成功");
  746. return "redirect:" + Global.getAdminPath() + "/order/detail/?id=" + orderID;
  747. }
  748. /**
  749. * 取消订单
  750. *
  751. * @return
  752. */
  753. @RequiresPermissions("order:order:edit")
  754. @RequestMapping("cancelOrder")
  755. public String cancelOrder(Integer orderID, RedirectAttributes redirectAttributes) {
  756. newOrderService.cancelOrder(orderID);
  757. addMessage(redirectAttributes, "取消订单成功");
  758. return "redirect:" + Global.getAdminPath() + "/order/detail/?id=" + orderID;
  759. }
  760. /**
  761. * 确认收货
  762. *
  763. * @param shopOrderID
  764. * @param redirectAttributes
  765. * @return
  766. */
  767. @RequiresPermissions("order:order:edit")
  768. @RequestMapping("confirmReceipt")
  769. public String confirmReceipt(Integer shopOrderID, RedirectAttributes redirectAttributes) {
  770. newShopOrderService.confirmReceipt(shopOrderID);
  771. addMessage(redirectAttributes, "确认收货成功");
  772. return "redirect:" + Global.getAdminPath() + "/order/detailPage/?shopOrderID=" + shopOrderID;
  773. }
  774. /**
  775. * 去子订单orderProduct页面
  776. *
  777. * @return
  778. */
  779. @RequiresPermissions("order:order:edit")
  780. @RequestMapping("toDeliveryPage")
  781. public String toDeliveryPage(NewOrder order, Model model) {
  782. List<NewOrderProduct> orderProduct = order.getOrderProduct();
  783. if (CollectionUtils.isNotEmpty(orderProduct))
  784. orderProduct.removeIf(p -> p.getProductID().intValue() == 999);
  785. for (NewOrderProduct newOrderProduct : orderProduct) {
  786. Integer cancelNum = newOrderProductDao.getActualCancelNum(newOrderProduct.getOrderProductID());
  787. cancelNum = cancelNum == null ? 0 : cancelNum;
  788. //统计未发货数量
  789. newOrderProduct.setNotOutStore(newOrderProduct.getNotOutStore() - cancelNum);
  790. }
  791. model.addAttribute("order", order);
  792. return "modules/order/ship";
  793. }
  794. /**
  795. * 填写物流信息页面
  796. *
  797. * @param params key = orderProdductID value = 发货数量
  798. * @return
  799. */
  800. @RequiresPermissions("order:order:edit")
  801. @RequestMapping("addLogisticsInfo")
  802. @ResponseBody
  803. public Map<String, Object> addLogisticsInfo(Model model, @RequestBody Map<String, String> params) {
  804. Map<String, Object> r = new HashMap<>();
  805. // 参数转换
  806. List<NewOrderProduct> orderProductList = new ArrayList<>();
  807. for (Map.Entry<String, String> entry : params.entrySet()) {
  808. NewOrderProduct orderProduct = newOrderProductService.get(entry.getKey());
  809. orderProduct.setDeliveryNum(Integer.valueOf(entry.getValue()));
  810. orderProductList.add(orderProduct);
  811. }
  812. model.addAttribute("orderProductList", orderProductList);
  813. r.put("data", orderProductList);
  814. return r;
  815. }
  816. @RequestMapping("toShipLogistic")
  817. public String toShipLogistic(Integer orderID, Model model) {
  818. model.addAttribute("orderID", orderID);
  819. return "modules/order/shipLogistic";
  820. }
  821. private String setImagePath(String path) {
  822. //获取文件服务器地址
  823. String photoServer = Global.getConfig("photoServer");
  824. ImageUploadInfo saveImageSerivce = new ImageUploadInfo();
  825. if (StringUtils.isNotBlank(path) && !path.startsWith("http:") && !path.startsWith("https:")) {
  826. path = Encodes.urlDecode(path);
  827. String realPath = UploadImageUtils.getAbsolutePath(path);
  828. int pointerIndex = realPath.lastIndexOf(".");
  829. try {
  830. saveImageSerivce = UploadUtils.saveImageSerivce(realPath, pointerIndex, realPath);
  831. return photoServer + saveImageSerivce.getSource();
  832. } catch (Exception e) {
  833. return path;
  834. }
  835. }
  836. return path;
  837. }
  838. /**
  839. * 发货
  840. *
  841. * @param params 参数 包含 shopOrderID子订单ID, key = orderProductID value = 发货数量 物流单号信息 key = 物流公司 value = 快递单号
  842. * @return
  843. */
  844. @RequiresPermissions("order:order:edit")
  845. @RequestMapping("delivery")
  846. @ResponseBody
  847. public Map<String, Object> delivery(@RequestBody Map<String, Object> params) {
  848. logger.info("delivery params===== " + params);
  849. Map<Integer, Integer> orderProductMap = new HashMap<>();
  850. Map<Integer, List<NewOrderProduct>> deliveryData = new HashMap<>(); //eg: {shopOrderID : [orderProductList], }
  851. Map<String, List<String>> logisticsInfo = new HashMap<>();
  852. String remarks = null;
  853. String[] images = new String[0];
  854. // 参数转换
  855. for (Map.Entry<String, Object> entry : params.entrySet()) {
  856. if (entry.getKey().contains("orderProductID")) {
  857. orderProductMap.put(Integer.valueOf(entry.getKey().split("_")[1]), Integer.valueOf(entry.getValue().toString()));
  858. }
  859. if (entry.getKey().contains("logisticsInfo")) {
  860. List<String> logisticsNus = Arrays.asList(entry.getValue().toString().split("_"));
  861. logisticsInfo.put(entry.getKey().split("_")[1], logisticsNus);
  862. }
  863. if (entry.getKey().contains("remarks")) {
  864. remarks = entry.getValue().toString();
  865. }
  866. if (entry.getKey().contains("remarkImages")) {
  867. images = entry.getValue().toString().split("##");
  868. }
  869. }
  870. String[] imgPath = new String[images.length];
  871. if (images.length > 0) {
  872. for (int i = 0; i < imgPath.length; i++) {
  873. imgPath[i] = setImagePath(images[i]);
  874. }
  875. }
  876. String remarkImage = StringUtils.join(imgPath, "##");
  877. Map<String, Object> result = new HashMap<>();
  878. List<NewOrderProduct> orderProducts = new ArrayList<>();
  879. for (Map.Entry<Integer, Integer> entry : orderProductMap.entrySet()) {
  880. NewOrderProduct o = newOrderProductService.get(String.valueOf(entry.getKey()));
  881. if (o.getNotOutStore() - entry.getValue() < 0) {
  882. result.put("success", false);
  883. result.put("msg", "发货数量异常");
  884. return result;
  885. }
  886. o.setNotOutStore(o.getNotOutStore() - entry.getValue());
  887. o.setThisTimePostNum(entry.getValue()); //这一次的发货数量
  888. if (o.getNotOutStore().intValue() == 0) {
  889. // 订单商品 已经发完
  890. o.setStatus(3);
  891. } else {
  892. // 订单商品 还没发完
  893. o.setStatus(4);
  894. }
  895. orderProducts.add(o);
  896. if (deliveryData.get(o.getShopOrderID()) == null) {
  897. List<NewOrderProduct> ops = new ArrayList<>();
  898. deliveryData.put(o.getShopOrderID(), ops);
  899. ops.add(o);
  900. } else {
  901. List<NewOrderProduct> ops = deliveryData.get(o.getShopOrderID());
  902. ops.add(o);
  903. }
  904. }
  905. //物流批次id
  906. String logisticsBatchId;
  907. try {
  908. logisticsBatchId = newOrderService.delivery(deliveryData, orderProducts, orderProductMap, logisticsInfo, remarks, remarkImage);
  909. } catch (Exception e) {
  910. logger.info(e.toString(), e);
  911. result.put("success", false);
  912. result.put("msg", e.getMessage());
  913. return result;
  914. }
  915. result.put("success", true);
  916. result.put("logisticsBatchId", logisticsBatchId);
  917. return result;
  918. }
  919. /**
  920. * 订单拆分
  921. *
  922. * @return
  923. */
  924. @RequiresPermissions("order:order:edit")
  925. @RequestMapping("splitOrder")
  926. @ResponseBody
  927. public Map<String, Object> splitOrder(@RequestBody Map<String, Map<String, String>> p) {
  928. Map<String, Object> map = new HashMap<>();
  929. try {
  930. for (Map.Entry<String, Map<String, String>> b : p.entrySet()) {
  931. Map<String, String> params = new HashMap<>();
  932. params.put("shopOrderID", b.getKey().split("_")[1]);
  933. for (Map.Entry<String, String> e : b.getValue().entrySet()) {
  934. params.put(e.getKey(), e.getValue());
  935. }
  936. Integer shopOrderID = null; //子订单ID
  937. Map<Integer, Integer> orderProductMap = new HashMap<>();
  938. for (Map.Entry<String, String> entry : params.entrySet()) {
  939. if ("shopOrderID".equals(entry.getKey()))
  940. shopOrderID = Integer.valueOf(entry.getValue());
  941. if (entry.getKey().contains("orderProductID"))
  942. orderProductMap.put(Integer.valueOf(entry.getKey().split("_")[1]), Integer.valueOf(entry.getValue()));
  943. }
  944. if (shopOrderID == null) {
  945. logger.info("参数错误shopOrderID == null了");
  946. map.put("success", false);
  947. map.put("msg", "参数错误");
  948. return map;
  949. }
  950. // 无收款记录的订单可对该订单下的商品可根据数量拆成一个订单
  951. // 还需要加上有无收款记录的判断
  952. List<Integer> receiptID = cmDiscernReceiptService.getReceiptRecords(shopOrderID);
  953. if (CollectionUtils.isNotEmpty(receiptID)) {
  954. //查到了收款记录仪 不能进行拆单操作了
  955. logger.info("收款记录ID ----->" + StringUtil.join(receiptID, ","));
  956. map.put("success", false);
  957. map.put("msg", "订单进行过收款操作, 无法拆分");
  958. return map;
  959. }
  960. List<NewOrderProduct> oldOrderProductList = new ArrayList<>();
  961. List<NewOrderProduct> newOrderProductList = new ArrayList<>();
  962. List<NewCmFinanceReceipts> cfrBakList = new ArrayList<>();
  963. for (Map.Entry<Integer, Integer> entry : orderProductMap.entrySet()) {
  964. if (entry.getValue() == null || entry.getValue() == 0) {
  965. continue;// 拆分数量为零则跳过
  966. }
  967. NewOrderProduct dbOrderProduct = newOrderProductService.get(entry.getKey() + "");
  968. int allNum = dbOrderProduct.getNum() + dbOrderProduct.getPresentNum();// 商品订单里面的总的商品数量(含赠品)
  969. double productNum = dbOrderProduct.getNum().doubleValue();// 商品订单里面的总的商品数量(不含赠品)
  970. NewOrderProduct newOrderProduct = newOrderProductService.get(entry.getKey() + "");
  971. newOrderProduct.setOrderProductID(null);
  972. newOrderProduct.setShopOrderID(null);
  973. newOrderProduct.setShopOrderNo(null);
  974. if (entry.getValue() >= dbOrderProduct.getNum()) { // 购买数量(含赠品)数量拆分
  975. // 拆分数量 >= 购买数量(不含赠品)
  976. newOrderProduct.setNum(dbOrderProduct.getNum());
  977. newOrderProduct.setPresentNum(entry.getValue() - dbOrderProduct.getNum());
  978. int dbOrderProductNum = dbOrderProduct.getNum();
  979. dbOrderProduct.setNum(0);
  980. dbOrderProduct.setPresentNum(dbOrderProduct.getPresentNum() - (entry.getValue() - dbOrderProductNum));
  981. if (dbOrderProduct.getNum().intValue() == 0 && dbOrderProduct.getPresentNum().intValue() == 0) {
  982. dbOrderProduct.setDelFlag("1");
  983. List<NewOrderProduct> orderProducts = newOrderProductService.findListByShopOrderID(shopOrderID); //子订单商品
  984. if (CollectionUtils.isNotEmpty(orderProducts) && orderProducts.size() == 1) { // 子订单里面只有一类订单商品
  985. // 别把商品全部拆走啦
  986. map.put("success", false);
  987. map.put("msg", "别把商品全部拆走啦");
  988. return map;
  989. }
  990. }
  991. } else {
  992. newOrderProduct.setNum(entry.getValue());
  993. newOrderProduct.setPresentNum(0);
  994. dbOrderProduct.setNum(dbOrderProduct.getNum() - entry.getValue());
  995. }
  996. dbOrderProduct.setNotOutStore(dbOrderProduct.getNotOutStore() - entry.getValue()); //未发货数量
  997. newOrderProduct.setNotOutStore(entry.getValue()); //未发货数量
  998. //总税费 TotalAddedValueTax
  999. Double oldAddedValueTax = dbOrderProduct.getTotalAddedValueTax();
  1000. Double newAddedValueTax = newOrderProduct.getTotalAddedValueTax();
  1001. dbOrderProduct.setTotalAddedValueTax(oldAddedValueTax * (dbOrderProduct.getNum() / productNum)); //单个税费 * 购买数量(不含赠品)
  1002. newOrderProduct.setTotalAddedValueTax(newAddedValueTax * (newOrderProduct.getNum() / productNum)); //单个税费 * 购买数量(不含赠品)
  1003. //总应付税费 shouldPayTotalTax---获取老的应付税费(不能使用单个计算,因为单个税费不包含经理折扣)
  1004. Double oldshouldPayTotalTax = dbOrderProduct.getShouldPayTotalTax();
  1005. Double NewhouldPayTotalTax = newOrderProduct.getShouldPayTotalTax();
  1006. dbOrderProduct.setShouldPayTotalTax(oldshouldPayTotalTax * (dbOrderProduct.getNum() / productNum)); //单个税费 * 购买数量(不含赠品)
  1007. newOrderProduct.setShouldPayTotalTax(NewhouldPayTotalTax * (newOrderProduct.getNum() / productNum)); //单个税费 * 购买数量(不含赠品)
  1008. // 总价 totalFee
  1009. dbOrderProduct.setTotalFee(dbOrderProduct.getDiscountPrice() * dbOrderProduct.getNum() + (dbOrderProduct.getAddedValueTax() * dbOrderProduct.getNum())); //折后单价 * 购买数量(不含赠品) + 税费
  1010. newOrderProduct.setTotalFee(newOrderProduct.getDiscountPrice() * newOrderProduct.getNum() + (newOrderProduct.getAddedValueTax() * newOrderProduct.getNum())); //折后单价 * 购买数量(不含赠品)+ 税费
  1011. //todo 5.0.0 经理折扣在订单商品中移除
  1012. // 经理折扣 discountFee
  1013. dbOrderProduct.setDiscountFee(dbOrderProduct.getDiscountFee() * (MathUtil.div(dbOrderProduct.getNum(), productNum).doubleValue())); // 按拆单前后购买数量的比例来分经理折扣
  1014. // cfrOld.setDeductionAmount(dbOrderProduct.getDiscountFee().toString());
  1015. newOrderProduct.setDiscountFee(newOrderProduct.getDiscountFee() * (MathUtil.div(newOrderProduct.getNum(), productNum).doubleValue())); // 按拆单前后购买数量的比例来分经理折扣
  1016. // cfrNew.setDeductionAmount(newOrderProduct.getDiscountFee().toString());
  1017. // 优惠 preferential
  1018. dbOrderProduct.setPreferential((dbOrderProduct.getPrice() - dbOrderProduct.getDiscountPrice()) * dbOrderProduct.getNum()); // 优惠 (price - discountPrice) * num
  1019. newOrderProduct.setPreferential((newOrderProduct.getPrice() - newOrderProduct.getDiscountPrice()) * newOrderProduct.getNum()); // 优惠 (price - discountPrice) * num
  1020. // 应付金额
  1021. dbOrderProduct.setShouldPayFee(dbOrderProduct.getTotalFee() - dbOrderProduct.getDiscountFee()); //应付金额 = totalFee - discountFee'
  1022. // cfrOld.setShouldPayAmount(dbOrderProduct.getShouldPayFee().toString());
  1023. newOrderProduct.setShouldPayFee(newOrderProduct.getTotalFee() - newOrderProduct.getDiscountFee()); //应付金额 = totalFee - discountFee'
  1024. // cfrNew.setShouldPayAmount(newOrderProduct.getShouldPayFee().toString());
  1025. // 应付供应商
  1026. dbOrderProduct.setShopFee(dbOrderProduct.getSingleShopFee() * (dbOrderProduct.getNum() + dbOrderProduct.getPresentNum()));
  1027. newOrderProduct.setShopFee(newOrderProduct.getSingleShopFee() * (newOrderProduct.getNum() + newOrderProduct.getPresentNum())); // 后台拆单后订单有采美 发货 应付金额全部给采美
  1028. // 应付第三方(不能使用单个计算,因为单个税费不包含经理折扣)
  1029. Double oldOtherFee = dbOrderProduct.getOtherFee();
  1030. Double newOtherFee = newOrderProduct.getOtherFee();
  1031. dbOrderProduct.setOtherFee((oldOtherFee / productNum) * dbOrderProduct.getNum());
  1032. newOrderProduct.setOtherFee((newOtherFee / productNum) * newOrderProduct.getNum()); // 后台拆单后订单有采美 发货 应付金额全部给采美
  1033. // 应付采美
  1034. Double oldCmFee = dbOrderProduct.getCmFee();
  1035. Double newCmFee = newOrderProduct.getCmFee();
  1036. dbOrderProduct.setCmFee((oldCmFee / productNum) * dbOrderProduct.getNum());
  1037. newOrderProduct.setCmFee((newCmFee / productNum) * newOrderProduct.getNum());
  1038. //重新计算orderProduct总价
  1039. dbOrderProduct.setTotalAmount(dbOrderProduct.getNum() * dbOrderProduct.getPrice());
  1040. // cfrOld.setTotalAmount(dbOrderProduct.getTotalAmount().toString());
  1041. newOrderProduct.setTotalAmount(newOrderProduct.getNum() * newOrderProduct.getPrice());
  1042. // cfrNew.setTotalAmount(newOrderProduct.getTotalAmount().toString());
  1043. newOrderProduct.setShopID(1000); // shopID = 1000 数据库固定数据表示采美
  1044. oldOrderProductList.add(dbOrderProduct);
  1045. newOrderProductList.add(newOrderProduct);
  1046. }
  1047. NewShopOrder dbShopOrder = newShopOrderService.findByShopOrderID(shopOrderID);
  1048. // 我要把没有参与拆单的订单商品 添加到oldOrderProductList 里面重新统计订单金额
  1049. loopA:
  1050. for (NewOrderProduct nop : dbShopOrder.getNewOrderProducts()) {
  1051. loopB:
  1052. for (NewOrderProduct old : oldOrderProductList) {
  1053. if (old.getOrderProductID().intValue() == nop.getOrderProductID().intValue()) {
  1054. continue loopA;
  1055. }
  1056. }
  1057. oldOrderProductList.add(nop); // looB 正常结束 说明这个nop没有参与拆单
  1058. }
  1059. newOrderService.splitOrder(shopOrderID, oldOrderProductList, newOrderProductList, cfrBakList);
  1060. }
  1061. map.put("success", true);
  1062. } catch (Exception e) {
  1063. logger.debug(e.toString(), e);
  1064. map.put("success", false);
  1065. map.put("msg", "拆分失败");
  1066. }
  1067. return map;
  1068. }
  1069. /**
  1070. * 获取子订单所有的发货记录
  1071. *
  1072. * @param shopOrderID
  1073. * @return
  1074. */
  1075. @RequiresPermissions("order:order:edit")
  1076. @RequestMapping("logisticsList")
  1077. public String logisticsList(Integer shopOrderID, Model model) {
  1078. List<List<NewOrderProduct>> logisticsList = newOrderProductService.logisticsList(shopOrderID);
  1079. model.addAttribute("logisticsList", logisticsList);
  1080. return "modules/order/addLogistics";
  1081. }
  1082. /**
  1083. * 发货完成以后去追加物流信息的页面,并且展示已有的物流单号
  1084. *
  1085. * @param logisticsBatchID 发货批次ID
  1086. * @return
  1087. */
  1088. @RequiresPermissions("order:order:edit")
  1089. @RequestMapping("toAppendLogisticsInfo")
  1090. public String toAppendLogisticsInfo(String logisticsBatchID, Model model) {
  1091. List<NewOrderProduct> opInfo = newShopOrderService.getBatchInfo(logisticsBatchID);
  1092. Map<String, List<String>> loInfo = newShopOrderService.getLogisticsInfo(logisticsBatchID);
  1093. model.addAttribute("opInfo", opInfo);
  1094. model.addAttribute("loInfo", loInfo);
  1095. model.addAttribute("logisticsBatchID", logisticsBatchID);
  1096. return "modules/order/appendShipLogistic";
  1097. }
  1098. /**
  1099. * 已经发货后追加物流信息
  1100. * params = {logisticsBatchID : 发货批次, remarks: 备注, logisticsInfo_快递公司名称: 单号_单号_.... }
  1101. *
  1102. * @return
  1103. */
  1104. @RequiresPermissions("order:order:edit")
  1105. @RequestMapping("appendLogisticsInfo")
  1106. @ResponseBody
  1107. public Map<String, Object> appendLogisticsInfo(@RequestBody Map<String, String> params) {
  1108. Map<String, Object> result = new HashMap<>();
  1109. String logisticsBatchID = null;
  1110. String remarks = null;
  1111. Map<String, List<String>> logisticsInfo = new HashMap<>();//物流编码
  1112. // 参数转换
  1113. for (Map.Entry<String, String> entry : params.entrySet()) {
  1114. if ("logisticsBatchID".equals(entry.getKey()))
  1115. logisticsBatchID = entry.getValue();
  1116. if ("remarks".equals(entry.getKey()))
  1117. remarks = entry.getValue();
  1118. if (entry.getKey().contains("logisticsInfo")) {
  1119. List<String> logisticsNus = Arrays.asList(entry.getValue().split("_"));
  1120. logisticsInfo.put(entry.getKey().split("_")[1], logisticsNus);
  1121. }
  1122. }
  1123. try {
  1124. Integer shopOrderID = newShopOrderService.appendLogisticsInfo(logisticsBatchID, logisticsInfo, remarks);
  1125. result.put("shopOrderID", shopOrderID);
  1126. result.put("success", true);
  1127. } catch (Exception e) {
  1128. result.put("success", false);
  1129. logger.debug(e.toString(), e);
  1130. result.put("msg", "数据异常");
  1131. }
  1132. return result;
  1133. }
  1134. /**
  1135. * 根据订单类型以及状态去不同的详情页
  1136. * (这是5.0.0以前的订单详情页面)
  1137. *
  1138. * @param order
  1139. * @return
  1140. */
  1141. @RequiresPermissions("order:order:edit")
  1142. @RequestMapping("detailPage")
  1143. public String detailPage(NewOrder order, Integer shopOrderID, Model model) {
  1144. if (order.getOrderID() != null) {
  1145. model.addAttribute("orderID", order.getOrderID());
  1146. model.addAttribute("orderProducts", order.getOrderProduct());
  1147. } else {
  1148. model.addAttribute("shopOrderID", shopOrderID);
  1149. }
  1150. NewShopOrder shopOrder = null;
  1151. if (shopOrderID != null) {
  1152. shopOrder = newShopOrderService.findByShopOrderID(shopOrderID);
  1153. order = newOrderService.get(shopOrder.getOrderID().toString());
  1154. model.addAttribute("orderProducts", shopOrder.getNewOrderProducts());
  1155. model.addAttribute("snOrderProducts", shopOrder.getSnOrderProducts());
  1156. }
  1157. if (shopOrderID != null && shopOrder.getSnOrderProducts() != null && shopOrder.getSnOrderProducts().size() > 0) {
  1158. //查询是否输入过SN码
  1159. List<CmProductSn> listSign = cmProductSnService.findSnByShopOrderID(shopOrderID);
  1160. if (null != listSign && listSign.size() > 0) {
  1161. model.addAttribute("listSign", listSign);
  1162. }
  1163. }
  1164. String payWay = order.getPayWay();
  1165. if (payWay != null) {
  1166. for (NewPayWay type : NewPayWay.values()) {
  1167. if (payWay.contains(type.getCode() + ""))
  1168. payWay = payWay.replaceAll(type.getCode() + "", type.getDesc());
  1169. }
  1170. order.setPayWay(payWay);
  1171. } else {
  1172. order.setPayWay("-");
  1173. }
  1174. model.addAttribute("orderUserInfo", order.getBpOrderUserinfo());
  1175. model.addAttribute("shopOrder", shopOrder);
  1176. model.addAttribute("order", order);
  1177. if ("0".equals(order.getOrderType())) {
  1178. // 协销订单
  1179. return "modules/order/bpOrderDetail";
  1180. } else {
  1181. // 普通订单
  1182. return "modules/order/normalOrderDetail";
  1183. }
  1184. }
  1185. /**
  1186. * 订单详情页 5.0.0版本 x
  1187. * 这个是新改的协销订单的详情页面
  1188. *
  1189. * @param order
  1190. * @return
  1191. */
  1192. @RequiresPermissions("order:order:view")
  1193. @RequestMapping("detail")
  1194. public String detail(NewOrder order, Model model) {
  1195. BpClause bpClause = new BpClause();
  1196. bpClause.setEnabledStatus("1");
  1197. List<BpClause> bpClauses = bpClauseService.findList(bpClause);
  1198. model.addAttribute("bpClauses", bpClauses);
  1199. //获取订单是否可以申请付款
  1200. List<Integer> oId = new ArrayList<>();
  1201. oId.add(order.getOrderID());
  1202. List<Integer> orderIdsInApplyReturn = cmReturnedPurchaseDao.findOrderIDsInApplyReturnFlag(oId);
  1203. if (CollectionUtils.isNotEmpty(orderIdsInApplyReturn) && orderIdsInApplyReturn.size() > 0) {
  1204. order.setApplyReturnedPurchaseFlag("0");
  1205. } else {
  1206. order.setApplyReturnedPurchaseFlag("1");
  1207. }
  1208. //判断是否有在收款审核的订单
  1209. List<Integer> ids = cmReceiptOrderRelationDao.toAudit(order.getOrderID());
  1210. if (ids != null && ids.size() > 0) {
  1211. order.setToAudit("1");
  1212. }
  1213. //一个子订单只有一个商品时,不可拆分
  1214. int count = 0;
  1215. for (NewShopOrder newShopOrder : order.getNewShopOrders()) {
  1216. if (newShopOrder.getShopID() != 998) {
  1217. count++;
  1218. }
  1219. }
  1220. if (order.getProductCount() == null) {
  1221. order.setProductCount(1);
  1222. }
  1223. if (order.getProductCount() <= count) {
  1224. order.setSplitFlag("0");
  1225. }
  1226. //是否抹平支付过(抹平最多只允许存在一次)
  1227. CmDiscernReceipt cmDiscernReceipt = cmDiscernReceiptDao.findSmoothoutInfo(order.getOrderID().toString());
  1228. if (null != cmDiscernReceipt) {
  1229. order.setAssociationType(cmDiscernReceipt.getAssociationType());
  1230. String confirmType = cmDiscernReceipt.getConfirmType();
  1231. order.setConfirmType(confirmType);
  1232. // 是否是一比款收了多个订单
  1233. if (StringUtils.equals(confirmType, "1") || StringUtils.equals(confirmType, "2") || StringUtils.equals(confirmType, "3")) {
  1234. List<CmReceiptOrderRelation> byReceiptList = cmReceiptOrderRelationService.findByReceiptID(cmDiscernReceipt.getId());
  1235. if (CollectionUtils.isNotEmpty(byReceiptList) && byReceiptList.size() > 1) {
  1236. order.setReceiptOrderFlag(true);
  1237. }
  1238. }
  1239. }
  1240. // 订单已收款才会出现抹平或者多收退余额,(已收再退款或者撤销退款订单即使存在抹平也需要当未抹平重新计算付款)
  1241. String receiptStatus = order.getReceiptStatus();
  1242. if (StringUtils.equals("3", receiptStatus)) {
  1243. if (null != cmDiscernReceipt) {
  1244. String confirmType = cmDiscernReceipt.getConfirmType();
  1245. order.setConfirmType(confirmType);
  1246. double associateAmount = cmDiscernReceiptDao.getAssociateAmount(String.valueOf(order.getOrderID()));
  1247. order.setOrderReceivedAmount(associateAmount);
  1248. //大额退余额
  1249. if (StringUtils.equals("3", confirmType)) {
  1250. String id = cmDiscernReceipt.getId();
  1251. double returnBalanceAmount = cmDiscernReceiptDao.getReturnBalanceAmount(id);
  1252. order.setReturnBalanceAmount(returnBalanceAmount);
  1253. }
  1254. }
  1255. }
  1256. //商城小程序下单时,获取下单门店的名称
  1257. if (order.getOrganizeID() >= 3 && order.getOrganizeStoreId() != null) {
  1258. String organizeStoreName = cmUserDao.getOrganizeStoreName(order.getOrganizeStoreId());
  1259. order.setOrganizeStoreName(organizeStoreName);
  1260. }
  1261. model.addAttribute("order", order);
  1262. if ("0".equals(order.getStatus())) {
  1263. try {
  1264. NewOrderConfig confirmOverTime = newOrderConfigService.getValueByKey("confirmOverTime");
  1265. Double value = confirmOverTime.getValue(); //待确认超过 value 小时自动取消订单
  1266. GregorianCalendar gc = new GregorianCalendar();
  1267. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  1268. Date orderTime = sdf.parse(order.getOrderTime());
  1269. gc.setTime(orderTime);
  1270. gc.add(Calendar.HOUR, value.intValue());
  1271. Date time = gc.getTime();
  1272. String ot = sdf.format(time);
  1273. if (time.after(new Date()))
  1274. model.addAttribute("time", ot);
  1275. } catch (Exception e) {
  1276. e.printStackTrace();
  1277. }
  1278. }
  1279. CmReturnedPurchase cmReturnedPurchase = new CmReturnedPurchase();
  1280. cmReturnedPurchase.setStatus("2");
  1281. cmReturnedPurchase.setOrderID(order.getOrderID());
  1282. List<CmReturnedPurchase> dataList = cmReturnedPurchaseService.getReturnedPurchaseList(cmReturnedPurchase);
  1283. Double returnedPurchaseFee = 0D; //退款(退货)总金额
  1284. Double refundFee = 0D; //退款总额(给买家)
  1285. for (CmReturnedPurchase bean : dataList) {
  1286. if (!bean.getStatus().equals("3")) {
  1287. returnedPurchaseFee += bean.getReturnedPurchaseFee();
  1288. refundFee += bean.getRefundFee();
  1289. }
  1290. }
  1291. double returnValue = 0d; //退货价值
  1292. if (order.getDiscountFee() >= returnedPurchaseFee) {
  1293. returnValue = 0d; //如果经理折扣大于退款(退货)总金额之和 那么先抵扣经理折扣 退款价值为0
  1294. } else {
  1295. returnValue = returnedPurchaseFee - order.getDiscountFee(); //抵用完经理折扣后才是真实价值
  1296. }
  1297. //订单已收金额
  1298. Double brokerage = cmUtilsDao.selectPayTotalFees(order.getOrderID());
  1299. model.addAttribute("brokerage", brokerage);
  1300. Double receiptAmount = cmDiscernReceiptService.findOrderReceipt(order.getOrderID());
  1301. model.addAttribute("returnValue", returnValue);
  1302. model.addAttribute("receiptAmount", receiptAmount == null ? 0 : receiptAmount);
  1303. model.addAttribute("returnedPurchaseFee", returnedPurchaseFee);
  1304. return "modules/order/orderDetail";
  1305. }
  1306. /**
  1307. * 去拆分订单详情页 5.0.0版本
  1308. *
  1309. * @param order
  1310. * @return
  1311. */
  1312. @RequiresPermissions("order:order:edit")
  1313. @RequestMapping("toSplit")
  1314. public String toSplit(NewOrder order, Model model) {
  1315. BpClause bpClause = new BpClause();
  1316. bpClause.setEnabledStatus("1");
  1317. List<BpClause> bpClauses = bpClauseService.findList(bpClause);
  1318. model.addAttribute("bpClauses", bpClauses);
  1319. model.addAttribute("order", order);
  1320. return "modules/order/splitPage";
  1321. }
  1322. /**
  1323. * 普通订单修改
  1324. *
  1325. * @param order
  1326. * @param model
  1327. * @return
  1328. */
  1329. @RequiresPermissions("order:order:edit")
  1330. @RequestMapping("normalOrderModify")
  1331. public String normalOrderModify(NewOrder order, Model model) {
  1332. model.addAttribute("order", order);
  1333. return "modules/order/modifyProduct";
  1334. }
  1335. /**
  1336. * 更新普通订单
  1337. *
  1338. * @param newOrder
  1339. * @param model
  1340. * @return
  1341. */
  1342. @RequiresPermissions("order:order:edit")
  1343. @RequestMapping("updateNormalOrder")
  1344. public String updateNormalOrder(NewOrder newOrder, Model model) {
  1345. if (!beanValidator(model, newOrder)) {
  1346. return normalOrderModify(newOrder, model);
  1347. }
  1348. if (CollectionUtils.isEmpty(newOrder.getOrderProduct())) {
  1349. model.addAttribute("message", "保存失败商品不能为空");
  1350. return normalOrderModify(newOrder, model);
  1351. } else {
  1352. List<NewOrderProduct> orderProductList = Lists.newArrayList();
  1353. for (NewOrderProduct newOrderProduct : newOrder.getOrderProduct()) {
  1354. if (StringUtils.isNotEmpty(newOrderProduct.getEnabledStatus())) {
  1355. NewOrderProduct o = (NewOrderProduct) JsonMapper.fromJsonString(newOrderProduct.getEnabledStatus(), NewOrderProduct.class);
  1356. Integer presentNum = o.getPresentNum() != null ? o.getPresentNum() : 0;
  1357. o.setPreferential((o.getPrice() - o.getDiscountPrice()) * o.getNum());//折扣
  1358. o.setDiscountFee(o.getTotalFee() - o.getShouldPayFee());//经理折扣
  1359. o.setTotalAmount(o.getPrice() * o.getNum());//商品总金额
  1360. o.setNotOutStore(o.getNum() + presentNum);
  1361. orderProductList.add(o);
  1362. }
  1363. }
  1364. if (CollectionUtils.isNotEmpty(orderProductList)) {
  1365. newOrder.setOrderProduct(orderProductList);
  1366. }
  1367. }
  1368. //更新订单
  1369. newOrderService.updateNormalOrder(newOrder);
  1370. return "redirect:" + Global.getAdminPath() + "/order/detailPage/?id=" + newOrder.getOrderID();
  1371. }
  1372. /**
  1373. * 物流详情展示
  1374. * <p>
  1375. * // * @param shopOrderID
  1376. *
  1377. * @param model
  1378. * @return
  1379. */
  1380. @RequiresPermissions("order:order:edit")
  1381. @RequestMapping("logisticsDetails")
  1382. public String logisticsDetails(Integer orderID, String logisticsBatchID, Model model, Integer orderType) {
  1383. List<LogisticsInfoVo> logisticsInfoVos = new ArrayList<>();
  1384. logisticsInfoVos = newShopOrderService.logisticsDetails(orderID, logisticsBatchID);
  1385. model.addAttribute("orderID", orderID);
  1386. model.addAttribute("orderType", orderType);
  1387. model.addAttribute("logisticsInfoVos", logisticsInfoVos);
  1388. return "modules/order/logisticsDetails";
  1389. }
  1390. /**
  1391. * 删除订单
  1392. *
  1393. * @return
  1394. */
  1395. @RequiresPermissions("order:order:delete")
  1396. @RequestMapping("deleteOrder")
  1397. public String deleteOrder(NewOrder order, Integer shopOrderID) {
  1398. if (order.getOrderID() != null) {
  1399. newOrderService.deleteOrder(order);
  1400. } else if (shopOrderID != null) {
  1401. newShopOrderService.deleteOrder(shopOrderID);
  1402. }
  1403. return "redirect:" + Global.getAdminPath() + "/order/orderList";
  1404. }
  1405. // 保存订单条款信息
  1406. @RequestMapping(value = "editclausecontent")
  1407. public String editclausecontent(NewOrder order, Model model) {
  1408. model.addAttribute("order", order);
  1409. return "modules/order/orderClause";
  1410. }
  1411. /**
  1412. * 置为已收款已付款
  1413. *
  1414. * @param orderId
  1415. * @return
  1416. */
  1417. @RequestMapping("toChangePay")
  1418. public String changePay(Integer orderId) {
  1419. newOrderService.changePay(orderId);
  1420. return "redirect:" + Global.getAdminPath() + "/order/orderList";
  1421. }
  1422. @RequestMapping(value = "saveClause")
  1423. public String saveClause(NewOrder order, RedirectAttributes redirectAttributes, HttpServletRequest request) {
  1424. String clauseContent = request.getParameter("clauseContent");
  1425. String clauseName = request.getParameter("clauseName");
  1426. order.setClauseContent(clauseContent);
  1427. order.setClauseName(clauseName);
  1428. newOrderService.updateClauseContent(order);
  1429. if (order.getOrderID() == null) {
  1430. //订单重新保存后则修改订单商品需供应商确认
  1431. newOrderProductService.updateShopConfigFlag(order.getOrderID());
  1432. }
  1433. return "redirect:" + Global.getAdminPath() + "/order/orderList";
  1434. }
  1435. /**
  1436. * 导出订单信息
  1437. *
  1438. * @param contractOrder
  1439. * @param shopOrderID
  1440. * @return
  1441. */
  1442. @RequiresPermissions("order:order:export")
  1443. @RequestMapping(value = "exportOrderInfo")
  1444. public void exportOrderInfo(NewOrder contractOrder, Integer shopOrderID, RedirectAttributes redirectAttributes, HttpServletResponse response) {
  1445. //获取订单数据
  1446. String fileName = contractOrder.getOrderID() + "-" + contractOrder.getBpOrderUserinfo().getName() + "-采美365网购订单.xls";
  1447. String template = Global.getConfig("export.template");
  1448. String templateFileName = template + "/new_bpstages_template.xls";
  1449. try {
  1450. List<NewOrderProduct> products = newOrderProductService.findWithOrderID(contractOrder.getOrderID());
  1451. for (NewOrderProduct orderProduct2 : products) {
  1452. //如果 =0 则设置为 0 方便页面判断
  1453. BigDecimal totalPay = new BigDecimal(orderProduct2.getTotalFee());
  1454. if (totalPay.compareTo(BigDecimal.ZERO) == 0) {
  1455. orderProduct2.setTotalFee(0D);
  1456. }
  1457. //设置税费
  1458. if (null == orderProduct2.getAddedValueTax() || "".equals(orderProduct2.getAddedValueTax()) || new BigDecimal(orderProduct2.getAddedValueTax()).compareTo(BigDecimal.ZERO) == 0) {
  1459. orderProduct2.setAddedValueTax(0D);
  1460. }
  1461. String image = orderProduct2.getImage();
  1462. //设置图片完整路径
  1463. orderProduct2.setImage(AppUtils.getProductImageURL(image, 0, Global.getConfig("wwwServer")));
  1464. }
  1465. List<NewOrderProduct> products1 = newOrderProductService.findByOrderIdGroupByShopId(contractOrder.getOrderID());
  1466. StringBuffer shopNameInfo = new StringBuffer();
  1467. //设置供应商信息
  1468. for (NewOrderProduct orderProduct1 : products1) {
  1469. shopNameInfo.append(orderProduct1.getShopName() + "、");
  1470. }
  1471. shopNameInfo.setLength(shopNameInfo.length() - 1);
  1472. contractOrder.setShopNameInfo(shopNameInfo.toString());
  1473. //设置订单商品信息
  1474. contractOrder.setOrderProduct(products);
  1475. BigDecimal stagesTotalFee = new BigDecimal(0);
  1476. StringBuffer buffer = new StringBuffer();
  1477. //设置list数据
  1478. List<NewOrder> list = Lists.newArrayList();
  1479. contractOrder.setClauseContent(StringUtils.replaceHtml(contractOrder.getClauseContent()));
  1480. list.add(contractOrder);
  1481. new ExcelUtil().createExcel(templateFileName, list, fileName, response);
  1482. } catch (Exception e) {
  1483. addMessage(redirectAttributes, "订单信息导出失败!" + e.getMessage());
  1484. e.printStackTrace();
  1485. }
  1486. }
  1487. /**
  1488. * 对账订单
  1489. *
  1490. * @param endTime 收款结束
  1491. * @param startTime 收款开始
  1492. * @param searchflag 0搜索,1导出
  1493. * @return
  1494. */
  1495. @RequiresPermissions("order:order:edit")
  1496. @RequestMapping("checkAccount")
  1497. public String checkAccount(String startTime, String endTime, Page page, String searchflag, Model model, RedirectAttributes redirectAttributes, HttpServletResponse response) {
  1498. if (StringUtils.isNotEmpty(startTime)) {
  1499. model.addAttribute("startTime", startTime);
  1500. startTime = startTime + " 00:00:00";
  1501. }
  1502. if (StringUtils.isNotEmpty(endTime)) {
  1503. model.addAttribute("endTime", endTime);
  1504. endTime = endTime + " 23:59:59";
  1505. }
  1506. NewReceiptList nr = new NewReceiptList();
  1507. nr.setStartTime(startTime);
  1508. nr.setEndTime(endTime);
  1509. page.setPageSize(10);
  1510. nr.setPage(page);
  1511. List<NewReceiptList> checkAccountList = newReceiptListService.findCheckAccountList(nr);
  1512. if (StringUtils.isNotEmpty(searchflag) && searchflag.length() != 2) {//导出操作
  1513. NewReceiptList nrExcel = new NewReceiptList();
  1514. nrExcel.setStartTime(startTime);
  1515. nrExcel.setEndTime(endTime);
  1516. List<NewReceiptList> excelList = newReceiptListService.findCheckAccountList(nrExcel);
  1517. setInit(excelList);
  1518. try {
  1519. excel(response, excelList);
  1520. } catch (Exception e) {
  1521. addMessage(redirectAttributes, "采美财务对账列表!" + e.getMessage());
  1522. e.printStackTrace();
  1523. }
  1524. }
  1525. setInit(checkAccountList);//初始化列表数据
  1526. page.setList(checkAccountList);
  1527. model.addAttribute("page", page);
  1528. return "modules/order/checkAccountOrder";
  1529. }
  1530. public void setInit(List<NewReceiptList> checkAccountList) {
  1531. if (CollectionUtils.isNotEmpty(checkAccountList)) {
  1532. for (NewReceiptList neList : checkAccountList) {
  1533. //统计订单已收总金额(已收商品金额+已收运费)
  1534. String received = neList.getReceived();//已收商品金额
  1535. neList.setReceivedTotal(received);//给定已收总金额默认值(协销订单没有运费,以及普通订单未付款或者到付情况下已收总金额=已收商品金额)
  1536. String orderTypeSys = neList.getOrderTypeSys();//订单类型---协销订单:0 ;普通订单:1
  1537. String status = neList.getStatus();//0, "待付款" 1,"待确认" 2, "已付款" "6, "交易关闭
  1538. String freight = neList.getFreight();//运费
  1539. String freePostFlag = neList.getFreePostFlag();//免邮标志 运费:-1到付,0包邮,1需要运费
  1540. if (StringUtils.equals(orderTypeSys, "1")) {//普通订单
  1541. if (StringUtils.equals(status, "2")) {//已付款
  1542. if (StringUtils.equals(freePostFlag, "1")) {//需要运费
  1543. double receivedD = Double.parseDouble(received);
  1544. double freightD = Double.parseDouble(freight);
  1545. double newReceivedTotal = receivedD + freightD;
  1546. neList.setReceivedTotal(String.valueOf(newReceivedTotal));//如果存在已付款的订单并且存在运费则已收金额需要加上运费
  1547. }
  1548. }
  1549. }
  1550. //订单全年99包邮处理
  1551. List<NewOrderProduct> orderProductList = newOrderProductDao.findListByOrderID(neList.getOrderId());
  1552. if (CollectionUtils.isNotEmpty(orderProductList) && orderProductList.size() > 0) {
  1553. for (NewOrderProduct nop : orderProductList) {
  1554. Integer orderProductID = nop.getProductID();
  1555. if (4413 == orderProductID) {
  1556. neList.setPostageFlag("1");//该订单是否包含99元包邮劵商品:0不是,1是99包邮劵
  1557. }
  1558. }
  1559. }
  1560. Map<String, Integer> typeMap = new HashMap<>();//存在同一个付款方式,过滤
  1561. //设置支付方式(客户付款)
  1562. String payWay = neList.getPayWay();
  1563. String payways = "";
  1564. if (StringUtils.isNotEmpty(payWay)) {
  1565. String[] split = payWay.split(",");
  1566. if (null != split) {
  1567. for (int i = 0; i < split.length; i++) {
  1568. Integer s = Integer.parseInt(split[i]);
  1569. String newPayWayName = NewPayWay.getNewPayWayName(s) + ",";
  1570. payways += newPayWayName;
  1571. }
  1572. }
  1573. }
  1574. if (null != payways && payways.length() > 0)
  1575. neList.setPayWay(payways.substring(0, payways.length() - 1));
  1576. //设置交易方式(付给供应商)
  1577. String transactionType = newReceiptListService.findTransactionType(neList.getOrderNo());
  1578. if (StringUtils.isNotEmpty(transactionType)) {
  1579. String[] split = transactionType.split(",");
  1580. if (null != split) {
  1581. for (int i = 0; i < split.length; i++) {
  1582. Integer s = Integer.parseInt(split[i]);
  1583. typeMap.put("" + s, s);
  1584. }
  1585. }
  1586. }
  1587. String transactionTypes = "";
  1588. if (null != typeMap) {
  1589. for (Integer s : typeMap.values()) {
  1590. if (102 == s) {
  1591. transactionTypes += "线下-建设银行7297,";
  1592. } else if (103 == s) {
  1593. transactionTypes += "线下-中信银行0897,";
  1594. } else if (104 == s) {
  1595. transactionTypes += "线下-中信银行7172,";
  1596. } else if (105 == s) {
  1597. transactionTypes += "线上-易宝支付,";
  1598. } else if (106 == s) {
  1599. transactionTypes += "线下-广发银行0115,";
  1600. } else if (101 == s) {
  1601. transactionTypes += "____________";
  1602. }
  1603. }
  1604. }
  1605. if (null != transactionTypes && transactionTypes.length() > 0)
  1606. neList.setTransactionType(transactionTypes.substring(0, transactionTypes.length() - 1));
  1607. //设置三个应付信息
  1608. NewReceiptList orderFees = newReceiptListService.findOrderFees(neList.getOrderId());
  1609. if (null != orderFees) {
  1610. neList.setTaxFee(orderFees.getTaxFee());
  1611. neList.setShopFee(orderFees.getShopFee());
  1612. neList.setOtherFee(orderFees.getOtherFee());
  1613. neList.setCmFee(orderFees.getCmFee());
  1614. } else {
  1615. neList.setTaxFee("0");
  1616. neList.setShopFee("0");
  1617. neList.setOtherFee("0");
  1618. neList.setCmFee("0");
  1619. }
  1620. //设置订单对应的供应商信息
  1621. List<NewOrderShop> newOrderShop = newReceiptListService.findNewOrderShop(neList.getOrderId());
  1622. neList.setNewOrderShopList(newOrderShop);
  1623. }
  1624. }
  1625. }
  1626. public void excel(HttpServletResponse response, List<NewReceiptList> excelList) {
  1627. //创建一个webbook,对应一个Excel文件
  1628. HSSFWorkbook wb = new HSSFWorkbook();
  1629. //在webbook中添加一个sheet,对应Excel文件中的sheet
  1630. HSSFSheet sheet = wb.createSheet("采美财务对账订单");
  1631. //创建单元格,并设置值表头 设置表头居中
  1632. HSSFCellStyle style = wb.createCellStyle();
  1633. style.setVerticalAlignment(VerticalAlignment.CENTER);//垂直
  1634. style.setAlignment(HorizontalAlignment.CENTER);//水平
  1635. style.setFillForegroundColor(HSSFColor.ORANGE.index);
  1636. HSSFCellStyle textStyle = wb.createCellStyle();
  1637. // textStyle.setf
  1638. // textStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 左右居中
  1639. // textStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 上下居中
  1640. //设置列宽(第几列,宽度)receivedTotal
  1641. sheet.setColumnWidth(0, 1500);//订单ID
  1642. sheet.setColumnWidth(1, 4800);//订单编号
  1643. sheet.setColumnWidth(2, 4800);//订单日期
  1644. sheet.setColumnWidth(3, 4800);//收款日期
  1645. sheet.setColumnWidth(4, 5000);//支付方式
  1646. sheet.setColumnWidth(5, 5000);//客户(会所)
  1647. sheet.setColumnWidth(6, 3200);//订单实付金额
  1648. sheet.setColumnWidth(7, 3200);//已收总金额
  1649. sheet.setColumnWidth(8, 3200);//已收商品金额
  1650. sheet.setColumnWidth(9, 3200);//已收运费
  1651. sheet.setColumnWidth(10, 5000);//付款方式
  1652. sheet.setColumnWidth(11, 3200);//应付税费
  1653. sheet.setColumnWidth(12, 3200);//应付供应商
  1654. sheet.setColumnWidth(13, 6000);//供应商名称
  1655. sheet.setColumnWidth(14, 3200);//支付类型
  1656. sheet.setColumnWidth(15, 3200);//已付金额
  1657. sheet.setColumnWidth(16, 3200);//应付第三方
  1658. sheet.setColumnWidth(17, 3200);//应付采美
  1659. sheet.setDefaultRowHeight((short) 0x270);//设置行高----貌似没有效果,所以下面每行独立设置行高
  1660. //第一行(表头)
  1661. String[] head = new String[]{"订单ID", "订单编号", "订单日期", "收款日期", "支付方式", "客户(会所)", "订单实付金额", "已收总金额", "已收商品金额", "已收运费", "付款方式", "应付税费", "应付供应商", "供应商名称", "支付类型", "已付金额", "应付第三方", "应付采美"};//在excel中的第4行每列的参数
  1662. HSSFCell cell;
  1663. HSSFRow row = sheet.createRow(0);
  1664. for (int i = 0; i < head.length; i++) {
  1665. cell = row.createCell(i);
  1666. row.setHeight((short) 0x270);
  1667. cell.setCellValue(head[i]);
  1668. cell.setCellStyle(style);
  1669. }
  1670. Integer currentUseRow = 1;//当前已使用行号(表头存在一行从1开始)
  1671. Integer currentMergeStartRow = 1;//开始合并行号
  1672. //循环遍历所有集合数据
  1673. if (CollectionUtils.isNotEmpty(excelList)) {
  1674. for (NewReceiptList rp : excelList) {
  1675. List<NewOrderShop> newOrderShopList = rp.getNewOrderShopList();
  1676. if (CollectionUtils.isNotEmpty(newOrderShopList)) {
  1677. int size = newOrderShopList.size() * 2;
  1678. for (int i = 0; i < newOrderShopList.size() * 2; i++) {
  1679. String shopName = "";
  1680. //String shopFees = newOrderShopList.get(i).getShopFees();//已付供应商金额
  1681. //1、首先求解本次遍历的i原始值是多少(列如:i=0[0/1],i=1[2/3],i=2[4/5]当为[]中的值时i的原始值如i)(相邻两行需相同,合并所需)
  1682. //1.1、求解公式集合原始i的值【为基数时:遍历i的值 减 1 除 2 、为偶数时:遍历i的值 除 2】
  1683. if (0 == i) {
  1684. shopName = newOrderShopList.get(i).getShopName();
  1685. } else {
  1686. int valuei = i;
  1687. boolean isEven = false;//是否是偶数,默认基数
  1688. isEven = i % 2 == 0 ? true : false;//是否是偶数
  1689. if (isEven) {//偶数
  1690. valuei = i / 2;
  1691. } else {//基数
  1692. valuei = (i - 1) / 2;
  1693. }
  1694. shopName = newOrderShopList.get(valuei).getShopName();
  1695. }
  1696. HSSFRow row2 = sheet.createRow(currentUseRow);
  1697. row2.setHeight((short) 0x270);
  1698. //创建订单ID列
  1699. cell = row2.createCell(0);
  1700. cell.setCellValue(rp.getOrderId());
  1701. cell.setCellStyle(textStyle);
  1702. //创建订单编号列
  1703. cell = row2.createCell(1);
  1704. cell.setCellValue(rp.getOrderNo());
  1705. cell.setCellStyle(textStyle);
  1706. //创建订单日期列
  1707. cell = row2.createCell(2);
  1708. String createTime = "———————";
  1709. if (null != rp.getCreateDate()) {
  1710. createTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(rp.getCreateDate());
  1711. }
  1712. cell.setCellValue(createTime);
  1713. cell.setCellStyle(textStyle);
  1714. //创建收款日期列
  1715. cell = row2.createCell(3);
  1716. String PayTime = "———————";
  1717. if (null != rp.getPayTime()) {
  1718. PayTime = rp.getPayTime();
  1719. }
  1720. cell.setCellValue(PayTime);
  1721. cell.setCellStyle(textStyle);
  1722. //创建支付方式列
  1723. cell = row2.createCell(4);
  1724. String payWay = "———————";
  1725. if (StringUtils.isNotEmpty(rp.getPayWay())) {
  1726. payWay = rp.getPayWay();
  1727. }
  1728. cell.setCellValue(payWay);
  1729. cell.setCellStyle(textStyle);
  1730. //创建客户(会所)列
  1731. cell = row2.createCell(5);
  1732. cell.setCellValue(rp.getName());
  1733. cell.setCellStyle(textStyle);
  1734. //创建订单实付金额列
  1735. cell = row2.createCell(6);
  1736. String payTotalFee = "0";
  1737. if (null != rp.getReceived()) {
  1738. payTotalFee = String.format("%.2f", Double.parseDouble(rp.getPayTotalFee()));
  1739. }
  1740. String postageFlag = rp.getPostageFlag();//该订单是否包含99元包邮劵商品:0不是,1是99包邮劵
  1741. if (StringUtils.equals("1", postageFlag)) {
  1742. payTotalFee = payTotalFee + "(含99元包邮劵)";
  1743. }
  1744. cell.setCellValue(payTotalFee);
  1745. cell.setCellStyle(textStyle);
  1746. //创建已收总金额列
  1747. cell = row2.createCell(7);
  1748. String receivedTotal = "0";
  1749. if (null != rp.getReceivedTotal()) {
  1750. receivedTotal = String.format("%.2f", Double.parseDouble(rp.getReceivedTotal()));
  1751. }
  1752. cell.setCellValue(receivedTotal);
  1753. cell.setCellStyle(textStyle);
  1754. //创建已收商品金额列
  1755. cell = row2.createCell(8);
  1756. String received = "0";
  1757. if (null != rp.getReceived()) {
  1758. received = String.format("%.2f", Double.parseDouble(rp.getReceived()));
  1759. }
  1760. cell.setCellValue(received);
  1761. cell.setCellStyle(textStyle);
  1762. //创建已收运费列
  1763. cell = row2.createCell(9);
  1764. String freight = "0";//默认运费
  1765. String status = rp.getStatus();//状态:0, "待付款" 1,"待确认" 2, "已付款" "6, "交易关闭
  1766. String freePostFlag = rp.getFreePostFlag();//免邮标志 运费:-1到付,0包邮,1需要运费
  1767. //没区分协销或者普通订单,因为协销订单运费默认为0不影响
  1768. if (StringUtils.equals(status, "2")) {//已付款
  1769. if (StringUtils.equals(freePostFlag, "-1")) {//-1到付
  1770. freight = "到付";
  1771. } else if (StringUtils.equals(freePostFlag, "0")) {//0包邮
  1772. freight = "包邮";
  1773. } else if (StringUtils.equals(freePostFlag, "1")) {//运费
  1774. freight = rp.getFreight();
  1775. }
  1776. } else {//未付款
  1777. if (StringUtils.equals(freePostFlag, "-1")) {//-1到付
  1778. freight = "到付";
  1779. } else if (StringUtils.equals(freePostFlag, "0")) {//0包邮
  1780. freight = "包邮";
  1781. } else if (StringUtils.equals(freePostFlag, "1")) {//运费
  1782. freight = "0";
  1783. }
  1784. }
  1785. cell.setCellValue(freight);
  1786. cell.setCellStyle(textStyle);
  1787. //创建付款方式列
  1788. cell = row2.createCell(10);
  1789. String transactionType = "———————";
  1790. if (null != rp.getTransactionType()) {
  1791. transactionType = rp.getTransactionType();
  1792. }
  1793. cell.setCellValue(transactionType);
  1794. cell.setCellStyle(textStyle);
  1795. //创建应付税费列
  1796. cell = row2.createCell(11);
  1797. String taxFee = "0";
  1798. if (null != rp.getTaxFee()) {
  1799. taxFee = String.format("%.2f", Double.parseDouble(rp.getTaxFee()));
  1800. }
  1801. cell.setCellValue(taxFee);
  1802. cell.setCellStyle(textStyle);
  1803. //创建应付供应商列
  1804. cell = row2.createCell(12);
  1805. String shopFee = "0";
  1806. if (null != rp.getShopFee()) {
  1807. shopFee = String.format("%.2f", Double.parseDouble(rp.getShopFee()));
  1808. }
  1809. cell.setCellValue(shopFee);
  1810. cell.setCellStyle(textStyle);
  1811. //11创建动态已收供应商列
  1812. cell = row2.createCell(13);//供应商名称
  1813. cell.setCellValue(shopName);
  1814. //公式解析等同上解释---(每个供应商存在两个账:公、私账)---遍历对应公私账的列数
  1815. if (0 == i) {//公账
  1816. cell = row2.createCell(14);//支付类型
  1817. cell.setCellValue("公账");
  1818. String publicAccount = newOrderShopList.get(i).getPublicAccount();
  1819. if (StringUtils.isEmpty(publicAccount)) {
  1820. publicAccount = "0";
  1821. }
  1822. cell = row2.createCell(15);//已付金额
  1823. cell.setCellValue(publicAccount);
  1824. } else {
  1825. int valuei = i;
  1826. boolean isEven = false;//是否是偶数,默认基数
  1827. isEven = i % 2 == 0 ? true : false;//是否是偶数
  1828. if (isEven) {//偶数(公账)
  1829. valuei = i / 2;
  1830. cell = row2.createCell(14);//支付类型
  1831. cell.setCellValue("公账");
  1832. String publicAccount = newOrderShopList.get(valuei).getPublicAccount();
  1833. if (StringUtils.isEmpty(publicAccount)) {
  1834. publicAccount = "0";
  1835. }
  1836. cell = row2.createCell(15);//已付金额
  1837. cell.setCellValue(publicAccount);
  1838. } else {//基数(私账)
  1839. valuei = (i - 1) / 2;
  1840. cell = row2.createCell(14);//支付类型
  1841. cell.setCellValue("私账");
  1842. String privateAccount = newOrderShopList.get(valuei).getPrivateAccount();
  1843. if (StringUtils.isEmpty(privateAccount)) {
  1844. privateAccount = "0";
  1845. }
  1846. cell = row2.createCell(15);//已付金额
  1847. cell.setCellValue(privateAccount);
  1848. }
  1849. }
  1850. //创建应付三方
  1851. cell = row2.createCell(16);//应付三方
  1852. String otherFee = "0";
  1853. if (null != rp.getOtherFee()) {
  1854. otherFee = String.format("%.2f", Double.parseDouble(rp.getOtherFee()));
  1855. }
  1856. cell.setCellValue(otherFee);
  1857. cell.setCellStyle(textStyle);
  1858. //创建应付采美
  1859. cell = row2.createCell(17);
  1860. String cmFee = "0";
  1861. if (null != rp.getCmFee()) {
  1862. cmFee = String.format("%.2f", Double.parseDouble(rp.getCmFee()));
  1863. }
  1864. cell.setCellValue(cmFee);
  1865. cell.setCellStyle(textStyle);
  1866. currentUseRow += 1;//供应商大小*2决定的存在的行数(累计统计)
  1867. }
  1868. //合并订单数据(除供应商名称和已付金额外都合并)
  1869. for (int j = currentMergeStartRow; j < currentUseRow; j++) {
  1870. sheet.addMergedRegion(new CellRangeAddress(j, currentUseRow - 1, 0, 0));//起始行号,终止行号, 起始列号,终止列号
  1871. sheet.addMergedRegion(new CellRangeAddress(j, currentUseRow - 1, 1, 1));//起始行号,终止行号, 起始列号,终止列号
  1872. sheet.addMergedRegion(new CellRangeAddress(j, currentUseRow - 1, 2, 2));//起始行号,终止行号, 起始列号,终止列号
  1873. sheet.addMergedRegion(new CellRangeAddress(j, currentUseRow - 1, 3, 3));//起始行号,终止行号, 起始列号,终止列号
  1874. sheet.addMergedRegion(new CellRangeAddress(j, currentUseRow - 1, 4, 4));//起始行号,终止行号, 起始列号,终止列号
  1875. sheet.addMergedRegion(new CellRangeAddress(j, currentUseRow - 1, 5, 5));//起始行号,终止行号, 起始列号,终止列号
  1876. sheet.addMergedRegion(new CellRangeAddress(j, currentUseRow - 1, 6, 6));//起始行号,终止行号, 起始列号,终止列号
  1877. sheet.addMergedRegion(new CellRangeAddress(j, currentUseRow - 1, 7, 7));//起始行号,终止行号, 起始列号,终止列号
  1878. sheet.addMergedRegion(new CellRangeAddress(j, currentUseRow - 1, 8, 8));//起始行号,终止行号, 起始列号,终止列号
  1879. sheet.addMergedRegion(new CellRangeAddress(j, currentUseRow - 1, 9, 9));//起始行号,终止行号, 起始列号,终止列号
  1880. sheet.addMergedRegion(new CellRangeAddress(j, currentUseRow - 1, 10, 10));//起始行号,终止行号, 起始列号,终止列号
  1881. sheet.addMergedRegion(new CellRangeAddress(j, currentUseRow - 1, 11, 11));//起始行号,终止行号, 起始列号,终止列号
  1882. sheet.addMergedRegion(new CellRangeAddress(j, currentUseRow - 1, 12, 12));//起始行号,终止行号, 起始列号,终止列号
  1883. sheet.addMergedRegion(new CellRangeAddress(j, currentUseRow - 1, 16, 16));//起始行号,终止行号, 起始列号,终止列号
  1884. sheet.addMergedRegion(new CellRangeAddress(j, currentUseRow - 1, 17, 17));//起始行号,终止行号, 起始列号,终止列号
  1885. }
  1886. currentMergeStartRow += size;//提供下一个订单出账合并使用
  1887. }
  1888. }
  1889. }
  1890. try {
  1891. ByteArrayOutputStream os = new ByteArrayOutputStream();
  1892. wb.write(os);
  1893. //调用浏览器自带的下载器,要先将数据转成byte流
  1894. String fileName = "采美订单对账列表.xls";
  1895. byte[] content = os.toByteArray();
  1896. response.setContentType("application/x-download");
  1897. response.setHeader("Content-disposition", "attachment; filename=" + Encodes.urlEncode(fileName));
  1898. response.getOutputStream().write(content);
  1899. response.getOutputStream().flush();
  1900. response.getOutputStream().close();
  1901. os.flush();
  1902. os.close();
  1903. } catch (Exception e) {
  1904. e.printStackTrace();
  1905. }
  1906. }
  1907. /**
  1908. * date 2019-1-28
  1909. * 最新的导出功能 以子订单来导出
  1910. * 导出子订单信息
  1911. *
  1912. * @param shopOrderID
  1913. * @return
  1914. */
  1915. @RequiresPermissions("order:order:export")
  1916. @RequestMapping(value = "exportSubOrder")
  1917. public void exportSubOrder(Integer shopOrderID, RedirectAttributes redirectAttributes, HttpServletResponse response) {
  1918. //获取订单数据
  1919. if (shopOrderID != null) {
  1920. NewShopOrder shopOrder = newShopOrderService.findByShopOrderID(shopOrderID);
  1921. if (shopOrder == null) {
  1922. addMessage(redirectAttributes, "参数异常, 订单信息导出失败!");
  1923. return;
  1924. }
  1925. NewOrder order = newOrderService.get(shopOrder.getOrderID().toString());
  1926. String fileName = order.getOrderID() + "-" + order.getBpOrderUserinfo().getName() + "-采美365网购订单.xls";
  1927. String template = Global.getConfig("export.template");
  1928. String templateFileName = template + "/shopOrder_template.xls";
  1929. OrderUserInfo orderUserInfo = orderUserInfoService.findByOrderID(order.getOrderID());
  1930. Map data = new HashMap<String, Object>();
  1931. data.put("shopOrder", shopOrder);
  1932. data.put("order", order);
  1933. data.put("orderUserInfo", orderUserInfo);
  1934. new ExcelUtil().createExcel(templateFileName, data, fileName, response);
  1935. } else {
  1936. addMessage(redirectAttributes, "参数异常, 订单信息导出失败!");
  1937. return;
  1938. }
  1939. }
  1940. /**
  1941. * 导出订单信息
  1942. *
  1943. * @param order
  1944. * @return
  1945. */
  1946. @RequiresPermissions("order:order:export")
  1947. @RequestMapping(value = "exportOrder")
  1948. public void exportOrder(NewOrder order, RedirectAttributes redirectAttributes, HttpServletResponse response) {
  1949. //获取订单数据
  1950. String fileName = order.getOrderID() + "-" + order.getBpOrderUserinfo().getName() + "-采美365网购订单.xls";
  1951. String template = Global.getConfig("export.template");
  1952. String templateFileName = template + "/order_info_template.xls";
  1953. try {
  1954. //freight 运费要算一下 ,totalAddedValueTax
  1955. Map data = new HashMap<String, Object>();
  1956. data.put("order", order);
  1957. new ExcelUtil().createExcel(templateFileName, data, fileName, response);
  1958. } catch (Exception e) {
  1959. addMessage(redirectAttributes, "订单信息导出失败!" + e.getMessage());
  1960. e.printStackTrace();
  1961. }
  1962. }
  1963. /**
  1964. * @return
  1965. */
  1966. @RequiresPermissions("order:order:postageOrderForm")
  1967. @RequestMapping(value = "postageOrderForm")
  1968. public String postageOrderForm(NewOrder newOrder, Model model) {
  1969. newOrder.setFreight(10D);
  1970. model.addAttribute("order", newOrder);
  1971. return "modules/order/postageOrderForm";
  1972. }
  1973. @RequiresPermissions("order:order:edit")
  1974. @RequestMapping(value = "postageOrderSave")
  1975. public String postageOrderSave(NewOrder newOrder, Model model, RedirectAttributes redirectAttributes, HttpServletRequest request) {
  1976. if (!beanValidator(model, newOrder)) {
  1977. return form(newOrder, model, request);
  1978. }
  1979. //保存订单
  1980. newOrderService.postageOrderSave(newOrder);
  1981. addMessage(redirectAttributes, "保存订单成功");
  1982. return "redirect:" + Global.getAdminPath() + "/order/orderList";
  1983. }
  1984. /**
  1985. * 编辑经理折扣
  1986. */
  1987. @RequiresPermissions("order:order:edit")
  1988. @RequestMapping(value = "DiscountFee")
  1989. public String editDiscountFee(NewOrder newOrder, Model model, RedirectAttributes redirectAttributes) {
  1990. NewOrder order = newOrderService.editDiscountFee(newOrder);
  1991. model.addAttribute("order", order);
  1992. return "modules/order/newOrderEdit";
  1993. }
  1994. /**
  1995. * 编辑返佣服务费
  1996. */
  1997. @RequiresPermissions("order:order:edit")
  1998. @RequestMapping(value = "RebateFee")
  1999. public String editRebateFee(NewOrder newOrder, Model model, RedirectAttributes redirectAttributes) {
  2000. NewOrder order = newOrderService.editRebateFee(newOrder);
  2001. model.addAttribute("order", order);
  2002. return "modules/order/rebateFeeEdit";
  2003. }
  2004. /**
  2005. * 保存返佣服务费
  2006. */
  2007. @RequiresPermissions("order:order:edit")
  2008. @ResponseBody
  2009. @RequestMapping(value = "saveRebateFee")
  2010. public Map<String, Object> saveRebateFee(NewOrder newOrder) {
  2011. Map<String, Object> map = new HashMap();
  2012. try {
  2013. newOrderService.saveRebateFee(newOrder);
  2014. map.put("success", true);
  2015. map.put("msg", "修改返佣服务费成功");
  2016. } catch (Exception e) {
  2017. map.put("success", false);
  2018. map.put("msg", "修改返佣服务费失败");
  2019. }
  2020. return map;
  2021. }
  2022. /**
  2023. * 保存经理折扣
  2024. */
  2025. @RequiresPermissions("order:order:edit")
  2026. @ResponseBody
  2027. @RequestMapping(value = "saveDiscountFee")
  2028. public Map<String, Object> saveDiscountFee(NewOrder newOrder) {
  2029. Map<String, Object> map = new HashMap();
  2030. try {
  2031. newOrderService.saveDiscountFee(newOrder);
  2032. map.put("success", true);
  2033. map.put("msg", "修改经理折扣成功");
  2034. } catch (Exception e) {
  2035. map.put("success", false);
  2036. map.put("msg", "修改经理折扣失败");
  2037. }
  2038. return map;
  2039. }
  2040. /**
  2041. * 供应商订单二维码
  2042. */
  2043. @ResponseBody
  2044. @RequestMapping("/shopOrderLink")
  2045. public Map<String, Object> shopOrderLink(Integer shopOrderId) {
  2046. Map<String, Object> map = new HashMap<>();
  2047. if (null == shopOrderId) {
  2048. map.put("success", false);
  2049. map.put("msg", "参数异常");
  2050. return map;
  2051. }
  2052. return newOrderService.shopOrderLink(shopOrderId);
  2053. }
  2054. /**
  2055. * 抹平收款数据显示
  2056. */
  2057. @ResponseBody
  2058. @RequestMapping("/gatheringData")
  2059. public Map<String, Object> gatheringData(Integer orderId) {
  2060. Map<String, Object> map = new HashMap<>();
  2061. if (null == orderId) {
  2062. map.put("success", false);
  2063. map.put("msg", "参数异常");
  2064. return map;
  2065. }
  2066. return newOrderService.gatheringData(orderId);
  2067. }
  2068. /**
  2069. * 抹平收款
  2070. */
  2071. @RequestMapping("/smoothOutCollection")
  2072. public void smoothOutCollection(CmDiscernReceipt discernReceipt) {
  2073. newOrderService.smoothOutCollection(discernReceipt);
  2074. }
  2075. /**
  2076. * 余额抵扣
  2077. */
  2078. @RequestMapping("balanceDeduction")
  2079. public String balanceDeduction(Integer orderID, RedirectAttributes redirectAttributes) {
  2080. newOrderService.balanceDeduction(orderID);
  2081. addMessage(redirectAttributes, "余额抵扣成功");
  2082. return "redirect:" + Global.getAdminPath() + "/order/orderList";
  2083. }
  2084. /**
  2085. * 转为返佣订单
  2086. */
  2087. @RequestMapping("modifyRebate")
  2088. public String modifyRebate(Integer orderId) {
  2089. newOrderService.modifyRebate(orderId);
  2090. //1二手 0非二手
  2091. Integer secondHandOrderFlag = cmUtilsDao.findOrderIsSecond(orderId);
  2092. if (1 == secondHandOrderFlag) {
  2093. return "redirect:" + Global.getAdminPath() + "/order/secondhandOrderList";
  2094. }
  2095. return "redirect:" + Global.getAdminPath() + "/order/orderList";
  2096. }
  2097. /**
  2098. * 商品资质列表
  2099. */
  2100. @RequestMapping("qualificationList")
  2101. public String qualificationList(Integer logisticsBatchId, Model model) {
  2102. List<LogisticsRecord> logisticsRecords = newOrderService.qualificationList(logisticsBatchId);
  2103. model.addAttribute("logisticsRecords", logisticsRecords);
  2104. Integer orderId = 0;
  2105. if (logisticsRecords != null && logisticsRecords.size() > 0) {
  2106. orderId = logisticsRecords.get(0).getOrderID();
  2107. }
  2108. model.addAttribute("orderId", orderId);
  2109. return "modules/order/qualification";
  2110. }
  2111. /**
  2112. * 商品资质编辑页面
  2113. */
  2114. @RequestMapping("qualificationForm")
  2115. public String qualificationForm(Integer recordId, Model model) {
  2116. LogisticsRecord logisticsRecord = newOrderService.qualificationForm(recordId);
  2117. model.addAttribute("logisticsRecord", logisticsRecord);
  2118. model.addAttribute("recordId", recordId);
  2119. return "modules/order/qualificationForm";
  2120. }
  2121. /**
  2122. * 商品资质保存
  2123. */
  2124. @RequestMapping("saveQualification")
  2125. public String saveQualification(LogisticsRecord logisticsRecord, RedirectAttributes redirectAttributes) {
  2126. newOrderService.saveQualification(logisticsRecord);
  2127. addMessage(redirectAttributes, "上传商品资质成功");
  2128. return "redirect:" + Global.getAdminPath() + "/order/qualificationList?logisticsBatchId=" + logisticsRecord.getLogisticsBatchID();
  2129. }
  2130. /**
  2131. * 查看商品资质
  2132. */
  2133. @RequestMapping("qualificationInfo")
  2134. public String qualificationInfo(Integer logisticsBatchId, Integer orderId, Model model) {
  2135. List<LogisticsRecord> recordList = newOrderService.qualificationInfo(logisticsBatchId);
  2136. model.addAttribute("recordList", recordList);
  2137. if (recordList != null && recordList.size() > 0) {
  2138. model.addAttribute("shopName", recordList.get(0).getShopName());
  2139. SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  2140. String uploadTime = format.format(recordList.get(0).getUploadTime());
  2141. model.addAttribute("uploadTime", uploadTime);
  2142. }
  2143. model.addAttribute("logisticsBatchId", logisticsBatchId);
  2144. model.addAttribute("orderId", orderId);
  2145. return "modules/order/qualificationInfo";
  2146. }
  2147. /**
  2148. * 获取当前机构下所有已领取优惠券
  2149. */
  2150. @ResponseBody
  2151. @RequestMapping("clubCouponList")
  2152. public Map<String, Object> clubCouponList(Integer userId) {
  2153. Map<String, Object> map = new HashMap<>();
  2154. if (null == userId) {
  2155. map.put("code", -1);
  2156. map.put("msg", "参数异常");
  2157. return map;
  2158. }
  2159. return newOrderService.clubCouponList(userId);
  2160. }
  2161. }