package com.matrix.system.hive.action; import cn.hutool.core.collection.CollUtil; import com.alibaba.fastjson.JSON; import com.matrix.component.asyncmessage.AsyncMessageManager; import com.matrix.core.exception.GlobleException; import com.matrix.core.pojo.AjaxResult; import com.matrix.core.pojo.PaginationVO; import com.matrix.core.tools.DateUtil; import com.matrix.core.tools.StringUtils; import com.matrix.core.tools.WebUtil; import com.matrix.core.tools.excl.ExcelSheetPO; import com.matrix.core.tools.excl.ExcelUtil; import com.matrix.core.tools.excl.ExcelVersion; import com.matrix.system.common.bean.BusParameterSettings; import com.matrix.system.common.bean.SysUsers; import com.matrix.system.common.constance.AppConstance; import com.matrix.system.common.dao.BusParameterSettingsDao; import com.matrix.system.common.dao.SysCompanyDao; import com.matrix.system.common.service.OperationLogService; import com.matrix.system.common.tools.DataAuthUtil; import com.matrix.system.common.tools.ResponseHeadUtil; import com.matrix.system.constance.Dictionary; import com.matrix.system.enums.OperationButtonEnum; import com.matrix.system.enums.OperationFunctionEnum; import com.matrix.system.hive.bean.*; import com.matrix.system.hive.dao.*; import com.matrix.system.hive.plugin.util.CollectionUtils; import com.matrix.system.hive.service.*; import com.matrix.system.shopXcx.mqTask.AsyncMessageRouting; import com.matrix.system.wechart.templateMsg.UniformMsgParam; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.transaction.annotation.Transactional; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.servlet.ModelAndView; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.OutputStream; import java.math.BigDecimal; import java.net.URLEncoder; import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * 线下订单 * * @author jiangyouyao * @date 2016-09-08 */ @Controller @RequestMapping(value = "admin/order") public class OrderController extends BaseController { @Resource private SysOrderService orderService; @Autowired ShoppingGoodsDao shoppingGoodsDao; @Autowired private CodeService codeService; @Autowired private SysOrderItemDao orderItemDao; @Resource private MoneyCardUseService cardUseService; @Autowired private MoneyCardUseDao moneyCardUseDao; @Autowired private SysOrderItemService orderItemService; @Autowired private SysOrderDao sysOrderDao; @Autowired private AchieveNewService achieveNewService; @Autowired SysShopInfoDao shopInfoDao; @Autowired private SysVipInfoService sysVipInfoService; @Autowired private SysOrderFlowService sysOrderFlowService; @Autowired private SysOrderFlowDao sysOrderFlowDao; @Autowired private BusParameterSettingsDao busParameterSettingsDao; @Autowired private SysProjServicesDao sysProjServicesDao; @Autowired private AsyncMessageManager asyncMessageManager; @Autowired private OperationLogService operationLogService; /** * 计算订单金额 */ @RequestMapping(value = "/calculationOrder") public @ResponseBody AjaxResult calculationOrder(@RequestBody SysOrder sysOrder) { BigDecimal total = BigDecimal.ZERO; BigDecimal zkTotal = BigDecimal.ZERO; //默认排序 List items = sysOrder.getItems(); for (int i = 0; i < items.size(); i++) { SysOrderItem item = items.get(i); zkTotal = zkTotal.add(new BigDecimal(item.getZkPrice() * item.getCount())); total = total.add(new BigDecimal(item.getPrice() * item.getCount())); } SysOrder sysOrderResult = new SysOrder(); sysOrderResult.setZkTotal(zkTotal.setScale(2, BigDecimal.ROUND_DOWN).doubleValue()); sysOrderResult.setTotal(total.doubleValue()); return AjaxResult.buildSuccessInstance(Arrays.asList(sysOrderResult)); } /** * 订单支付 */ @RequestMapping(value = "/payOrder") @Transactional(rollbackFor = Exception.class) public @ResponseBody AjaxResult payOrder(@RequestBody SysOrder sysOrder) { SysUsers user = getMe(); sysOrder.setShopId(user.getShopId()); sysOrder.setOrderType(SysOrder.ORDER_TYPE_SEAL); sysOrder.setIsHasRefund(SysOrder.IS_HAS_REFUND_N); //校验订单是否满足结算调价,新订单则保存订单,已有订单则删除后更新 sysOrder = orderService.checkAndSaveOrder(sysOrder); orderService.updateReceiptMoney(sysOrder); //发送微信公众号提醒 UniformMsgParam uniformMsgParam = new UniformMsgParam(user.getCompanyId(), UniformMsgParam.GZH_GMCG); uniformMsgParam.put("orderId", sysOrder.getId()); asyncMessageManager.sendMsg(AsyncMessageRouting.SEND_UNIFORM_TEMPLATE_MSG ,uniformMsgParam); //处理用户购买的产品 return AjaxResult.buildSuccessInstance(Arrays.asList(sysOrder), "订单结算成功"); } /** * 退款 * * @param sysOrder * @return */ @RequestMapping(value = "/refundOrder") @ResponseBody public AjaxResult refundOrder(@RequestBody SysOrder sysOrder) { //储值卡订单不能通过退款渠道退款 if (CollectionUtils.isNotEmpty(sysOrder.getItems())) { List orderItem = orderItemService.findByOrderId(sysOrder.getItems().get(0).getOrderId()); if (orderItem.size() == 1) { if (orderItem.get(0).getShoppingGoods().getCode().equals("vipCzk")) { return AjaxResult.buildFailInstance("充值订单请直接冲负数金额退款!"); } } } orderService.refundOrderMoney(sysOrder); //处理用户购买的产品 return AjaxResult.buildSuccessInstance(Arrays.asList(sysOrder), "订单退款成功"); } /** * 订单保存接口 */ @RequestMapping(value = "/saveOrder") @Transactional(rollbackFor = Exception.class) public @ResponseBody AjaxResult saveOrder(@RequestBody SysOrder sysOrder) { SysUsers user = getMe(); sysOrder.setShopId(user.getShopId()); //校验保存订单 sysOrder = orderService.checkAndSaveOrder(sysOrder); //处理用户购买的产品 return AjaxResult.buildSuccessInstance(Arrays.asList(sysOrder), "订单保存成功"); } /** * 列表显示 */ @RequestMapping(value = "/showList") public @ResponseBody AjaxResult showList(SysOrder sysOrder, PaginationVO pageVo) { //默认排序 if (StringUtils.isBlank(pageVo.getSort())) { pageVo.setSort("order_time"); } if (StringUtils.isBlank(pageVo.getOrder())) { pageVo.setOrder("desc"); } if (!DataAuthUtil.hasAllShopAuth()) { sysOrder.setShopId(getMe().getShopId()); } sysOrder.setCompanyId(getMe().getCompanyId()); return new AjaxResult(AjaxResult.STATUS_SUCCESS, orderService.findInPage(sysOrder, pageVo), orderService.findTotal(sysOrder)); } /** * 展示员工创建的订单列表显示 */ @RequestMapping(value = "/showStaffOrder") public @ResponseBody AjaxResult showStaffOrder(SysOrder sysOrder, PaginationVO pageVo) { sysOrder.setStaffId(getMe().getSuId()); return showList(sysOrder, pageVo); } @Resource SysCompanyDao companyDao; /** * 打印订单 */ @RequestMapping(value = "/printOrder") public @ResponseBody ModelAndView printOrder(SysOrder order) throws GlobleException { ModelAndView mv = new ModelAndView("admin/hive/beautySalon/print-order"); SysUsers user = getMe(); String comRegisterCode = companyDao.selectById(user.getCompanyId()).getComRegisterCode(); if (StringUtils.isNotBlank(comRegisterCode)) { mv.addObject("page", comRegisterCode); } else { mv.addObject("page", "taiyan"); } return mv; } /** * 收款 */ @RequestMapping(value = "/sk") public @ResponseBody AjaxResult sk(SysOrder order) throws GlobleException { orderService.updateReceiptMoney(order); return new AjaxResult(AjaxResult.STATUS_SUCCESS, "收款成功"); } /** * 更新订单的 */ @RequestMapping(value = "/updateOrderTime") public @ResponseBody @Transactional(rollbackFor = Exception.class) AjaxResult updateOrderTime(SysOrder sysOrder) { sysOrderDao.updateOrderTime(sysOrder.getPayTime(), sysOrder.getId()); // 修改业绩时间 // 更新业绩时间 AchieveNew achieveNew = new AchieveNew(); achieveNew.setOrderId(sysOrder.getId()); achieveNew.setDatatime(sysOrder.getPayTime()); achieveNewService.modifyAchieveTime(achieveNew); //更新收款流水时间 sysOrderFlowDao.updateTimeByOrderId(sysOrder.getId(), sysOrder.getPayTime()); //保存单据日志 sysOrder= sysOrderDao.selectById(sysOrder.getId()); operationLogService.saveOperation(sysOrder.getCompanyId(), sysOrder.getShopId(),getMe().getSuId(), OperationFunctionEnum.ORDER, OperationButtonEnum.ORDER_UPDATE_TIME, sysOrder.getId(), sysOrder.getOrderNo(), sysOrder.getVipId(), "更新参数: "+JSON.toJSONString(sysOrder)); return new AjaxResult(AjaxResult.STATUS_SUCCESS, "修改成功"); } /** * 根据订单ID查询订单信息 */ @RequestMapping(value = "/getShopOrder") public @ResponseBody AjaxResult getShopOrder(Long id) { SysOrder order = orderService.findById(id); order.setItems(orderItemDao.selectByOrderId(id)); AjaxResult result = AjaxResult.buildSuccessInstance(""); result.putInMap("order", order); MoneyCardUse cardUseInfo = cardUseService.findByVipId(order.getVipId()); if (cardUseInfo == null) { cardUseInfo = sysVipInfoService.addVipDefaultCard(order.getVipId()); } //打印需求加入门店信息 result.putInMap("shopInfo", shopInfoDao.selectById(order.getShopId())); result.putInMap("moneyCar", cardUseInfo); //查询会有所有有效的会员卡 result.putInMap("totalMoney", moneyCardUseDao.selectVipCardTotalMoney(order.getVipId())); return result; } /** * 根据订单ID查询订单信息 */ @RequestMapping(value = "/findOrderById/{id}") @ResponseBody public AjaxResult findOrderById(@PathVariable Long id) { SysOrder order = orderService.findById(id); order.setItems(orderItemDao.selectByOrderId(id)); return AjaxResult.buildSuccessInstance(Arrays.asList(order)); } //=======================================页面转发================================== /** * 根据订单ID查询订单信息 */ @RequestMapping(value = "/findOrderDetailById") public String findOrderDetailById(Long id) { SysOrder order = orderService.findById(id); order.setItems(orderItemDao.selectByOrderId(id)); WebUtil.getRequest().setAttribute("order", order); return "admin/hive/mobile/order-history-msg"; } /** * 跳转 收款页面 * * @author jyy */ @RequestMapping(value = "/editFormSk1") public String editFormSk1(Long id) { // 根据id查到对应的订单信息 SysOrder order = orderService.findById(id); //查询出订单明细 List sysOrderItems = orderItemDao.selectByOrderId(id); order.setItems(sysOrderItems); WebUtil.getRequest().setAttribute("order", order); MoneyCardUse moneyCardUse = new MoneyCardUse(); moneyCardUse.setVipId(order.getVipId()); moneyCardUse.setStatus(Dictionary.MONEYCARD_STATUS_YX); List cards = cardUseService.findByModel(moneyCardUse); WebUtil.getRequest().setAttribute("cards", cards); return "admin/hive/beautySalon/sk-form"; } /** * 查询订单信息 * * @throws GlobleException * @author jyy */ @RequestMapping(value = "/getOrder") public String getOrder(Long id) { SysOrder order = orderService.findById(id); MoneyCardUse moneyCardUse = new MoneyCardUse(); moneyCardUse.setVipId(order.getVipId()); moneyCardUse.setStatus(Dictionary.MONEYCARD_STATUS_YX); List cards = cardUseService.findByModel(moneyCardUse); WebUtil.getRequest().setAttribute("cards", cards); WebUtil.getRequest().setAttribute("order", order); return "admin/hive/beautySalon/point-order"; } @RequestMapping(value = "/findOrderDetailByIdOrNo") @ResponseBody public AjaxResult findOrderDetailByIdOrNo(SysOrder orderVo) { // 根据id查到对应的订单信息 SysOrder order = null; if (orderVo.getId() != null) { order = orderService.findById(orderVo.getId()); } else if (StringUtils.isNotBlank(orderVo.getOrderNo())) { List byModel = orderService.findByModel(orderVo); if (byModel.size() == 1) { order = orderService.findById(byModel.get(0).getId()); } } List sysOrderItems = orderItemDao.selectByOrderId(order.getId()); order.setItems(sysOrderItems); SysVipInfo vipInfo = sysVipInfoService.findById(order.getVipId()); // 根据会员Id查到会员有效的会员卡 // 根据订单号查找订单条目 List orderItems = orderItemService.findByOrderId(order.getId()); MoneyCardUse moneyCardUse = new MoneyCardUse(); moneyCardUse.setVipId(order.getVipId()); List cards = cardUseService.findByModel(moneyCardUse); List flows = sysOrderFlowService.findByOrderId(order.getId()); order.setFlows(flows); List payMethods = sysOrderFlowService.findPayMethodsAmount(order.getId()); List achieveList = achieveNewService.findOrderItemAchieve(order.getId()); AjaxResult ajaxResult = AjaxResult.buildSuccessInstance("获取成功"); ajaxResult.putInMap("orderItems", orderItems); ajaxResult.putInMap("order", order); ajaxResult.putInMap("cards", cards); ajaxResult.putInMap("vipInfo", vipInfo); ajaxResult.putInMap("payMethods", payMethods); ajaxResult.putInMap("achieveList", achieveList); return ajaxResult; } /** * 跳转 消费流水详情页面 * * @author jyy */ @RequestMapping(value = "/orderItem") public String orderItem(SysOrder orderVo) { if (orderVo.getId() != null) { WebUtil.getRequest().setAttribute("orderParam", orderVo.getId()); WebUtil.getRequest().setAttribute("orderId", orderVo.getId()); } else if (StringUtils.isNotBlank(orderVo.getOrderNo())) { WebUtil.getRequest().setAttribute("orderParam", orderVo.getOrderNo()); WebUtil.getRequest().setAttribute("orderNo", orderVo.getOrderNo()); } return "admin/hive/beautySalon/orderXq-form"; } @RequestMapping(value = "/toUpdateTime") public String toUpdateTime(Long id) { // 根据id查到对应的订单信息 SysOrder order = orderService.findById(id); WebUtil.getRequest().setAttribute("order", order); return "admin/hive/beautySalon/updateOrderTime"; } //=======================================页面转发END================================== /** * 2021-08-20 新增:erp系统取消订单接口,不做订单状态校验 * 取消订单 */ @Transactional(rollbackFor = Exception.class) @RequestMapping(value = "/erpCancelOrder") public @ResponseBody AjaxResult erpCancelOrder(Long id) { AjaxResult result = new AjaxResult(); SysOrder order = orderService.findById(id); if (order == null) { return new AjaxResult(AjaxResult.STATUS_FAIL, "订单不存在!"); } List items = orderItemDao.selectByOrderId(id); for (SysOrderItem item : items) { List sysProjServices = sysProjServicesDao.selectProjServicesByOrderItemId(item.getId()); if (CollUtil.isNotEmpty(sysProjServices)) { return new AjaxResult(AjaxResult.STATUS_FAIL, "订单存在进行中的服务单无法取消/删除"); } } orderService.cancelOrder(id); result.setInfo("取消成功!"); result.setStatus(AjaxResult.STATUS_SUCCESS); return result; } /** * 取消订单 */ @Transactional(rollbackFor = Exception.class) @RequestMapping(value = "/cancelOrder") public @ResponseBody AjaxResult cancelOrder(Long id, Integer del) { SysOrder order = orderService.findById(id); BusParameterSettings shopManageAbleCancelDfkOrder = busParameterSettingsDao.selectCompanyParamByCode(AppConstance.SHOP_MANAGE_ABLE_CANCEL_DFK_ORDER, order.getCompanyId()); if (StringUtils.isNotBlank(shopManageAbleCancelDfkOrder.getParamValue()) && shopManageAbleCancelDfkOrder.getParamValue().equals(Dictionary.FLAG_YES)) { if (!Dictionary.ORDER_STATU_DFK.equals(order.getStatu())) { return new AjaxResult(AjaxResult.STATUS_FAIL, "您只能取消待付款订单"); } } return erpCancelOrder(id); } @RequestMapping(value = "/exportExcel") public void report(ModelMap model, HttpServletRequest request, HttpServletResponse response, SysOrder sysOrder) throws Exception { sysOrder.setShopId(getMe().getShopId()); doExportOrder(response, sysOrder); return; } /** * 总部订单导出 */ @RequestMapping(value = "/erpExportExcel") public void erpExportExcel(ModelMap model, HttpServletRequest request, HttpServletResponse response, SysOrder sysOrder) throws Exception { doExportOrder(response, sysOrder); return; } /** * 执行订单导出,总部和门店共用,但是搜索条件不一样 * * @param response * @param sysOrder * @throws IOException */ private void doExportOrder(HttpServletResponse response, SysOrder sysOrder) throws IOException { //保存单据日志 operationLogService.saveOperation(getMe().getCompanyId(), getMe().getShopId(),getMe().getSuId(), OperationFunctionEnum.ORDER, OperationButtonEnum.EXPORT, String.format("导出参数:%s" , JSON.toJSONString(sysOrder))); List res = new ArrayList<>(); ExcelSheetPO orderSheet = new ExcelSheetPO(); String title = "订单记录"; orderSheet.setSheetName(title); orderSheet.setTitle(title); String[] header = {"订单号", "客户姓名", "客户手机", "下单时间", "订单总价", "折后价", "现金付款", "卡付款", "顾问姓名", "收银员", "所属门店", "订单状态"}; orderSheet.setHeaders(header); //门店只能查询本店自己的订单 List dataList = orderService.findInPage(sysOrder, null); List> list = new ArrayList<>(); if (dataList.size() > 0) { for (SysOrder item : dataList) { List temp = new ArrayList<>(); temp.add(item.getOrderNo()); temp.add(item.getVipName()); temp.add(item.getVipPhone()); temp.add(DateUtil.dateToString(item.getOrderTime(), DateUtil.DATE_FORMAT_MM)); temp.add(item.getTotal()); temp.add(item.getZkTotal()); temp.add(item.getCashPay()); temp.add(item.getCardPay()); temp.add(item.getStaffName()); temp.add(item.getCashierName()); temp.add(item.getShopName()); temp.add(item.getStatu()); list.add(temp); } } orderSheet.setDataList(list); res.add(orderSheet); response = ResponseHeadUtil.setExcelHead(response); response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(title + DateUtil.getTimeMark() + ".xlsx".trim(), "UTF-8")); OutputStream os = response.getOutputStream(); ExcelUtil.createWorkbookAtOutStream(ExcelVersion.V2007, res, os, true); } }