package com.jflyfox.api.controller; import com.alibaba.fastjson.JSON; import com.jfinal.aop.Before; import com.jfinal.kit.HttpKit; import com.jfinal.kit.Kv; import com.jfinal.plugin.activerecord.Db; import com.jfinal.plugin.activerecord.Record; import com.jflyfox.api.constant.ApiConstant; import com.jflyfox.api.entity.TbOrder; import com.jflyfox.api.entity.TbOrderCommodity; import com.jflyfox.api.enums.OrderStatus; import com.jflyfox.api.form.ApiForm; import com.jflyfox.api.form.ApiResp; import com.jflyfox.api.form.OrderAddForm; import com.jflyfox.api.form.OrderCommodityForm; import com.jflyfox.api.interceptor.ApiInterceptor; import com.jflyfox.api.service.impl.IOrderServerImpl; import com.jflyfox.component.base.BaseProjectController; import com.jflyfox.component.util.JFlyFoxUtils; import com.jflyfox.jfinal.component.annotation.ControllerBind; import com.jflyfox.jfinal.component.db.SQLUtils; import com.jflyfox.system.user.SysUser; import java.time.LocalDateTime; import java.time.ZoneOffset; import java.time.format.DateTimeFormatter; import java.util.HashMap; import java.util.List; import java.util.Map; /** * @author :likai * @date :Created in 2020/6/22 14:59 */ @Before(ApiInterceptor.class) @ControllerBind(controllerKey = "/api/order") public class OrderController extends BaseProjectController { private IOrderServerImpl orderServer = new IOrderServerImpl(); /** * 列表页 */ public void list() { ApiForm form = getBean(ApiForm.class, null); SysUser user = getSysUser(form); if (user == null) return; ApiResp resp = orderServer.page(user, form); renderJson(resp); } /** * 列表页 */ public void info() { ApiForm form = getBean(ApiForm.class, null); SysUser user = getSysUser(form); if (user == null) return; TbOrder order = getOrder(form, getParaToInt()); if (order == null) return; ApiResp resp = orderServer.info(form, order); renderJson(resp); } /** * 添加订单 */ public void add() { ApiForm form = getBean(ApiForm.class, null); SysUser user = getSysUser(form); if (user == null) return; OrderAddForm addForm = JSON.parseObject(HttpKit.readData(getRequest()), OrderAddForm.class); TbOrder model = new TbOrder(); if (checkContractNo(form, addForm.getContract_no(), null)) return; model.put("consumer_name", addForm.getConsumer_name()); model.put("create_time", getNow()); model.put("contract_no", addForm.getContract_no()); model.put("create_id", user.getUserid()); model.put("status", OrderStatus.CREATE.name()); model.put("order_number", "CG-" + getTimeStr()); model.save(); //保存中间表信息 for (OrderCommodityForm orderCommodityForm : addForm.getCommoditys()) { TbOrderCommodity orderCommodity = new TbOrderCommodity(); orderCommodity.put("order_id", model.getInt("id")); orderCommodity.put("commodity_id", orderCommodityForm.getId()); orderCommodity.put("number", orderCommodityForm.getNumber()); orderCommodity.save(); } //计算总数量/总金额 setTotalNumberAndTotalMoney(model); renderJson(new ApiResp(form)); } /** * 检查订单标号是否存在 * * @param form 表单 * @param contractNo 订单号 * @param currOrderId 当前订单ID * @return */ private boolean checkContractNo(ApiForm form, String contractNo, Integer currOrderId) { SQLUtils sqlUtils = new SQLUtils("select * from tb_order where 1=1"); sqlUtils.whereEquals("contract_no", contractNo); TbOrder order = TbOrder.dao.findFirst(sqlUtils.toString()); if (order != null && !order.getInt("id").equals(currOrderId)) { renderJson(new ApiResp(form).setCode(ApiConstant.CODE_FAIL).setMsg("合同编号已存在")); return true; } return false; } /** * 订单设置总数量和总金额 * * @param model 订单对象 */ private void setTotalNumberAndTotalMoney(TbOrder model) { Record record = Db.findFirst("SELECT sum(toc.number) as 'total_number', SUM(convert(toc.number * tc.price,decimal(15,2))) AS 'total_money' FROM tb_order_commodity toc LEFT JOIN tb_commodity tc on tc.id = toc.commodity_id where toc.order_id = " + model.getInt("id")); model.setTOTAL_NUMBER(record.getStr("total_number")); model.setTOTAL_MONEY(record.getStr("total_money")); model.update(); } public void change_status() { ApiForm form = getBean(ApiForm.class, null); SysUser user = getSysUser(form); if (user == null) return; Integer id = getParaToInt(); TbOrder order = getOrder(form, id); if (order == null) return; changeOrderStatus(OrderStatus.valueOf(order.getStr("status")), form, user, order); } /** * 修改订单 */ public void edit() { ApiForm form = getBean(ApiForm.class, null); SysUser user = getSysUser(form); if (user == null) return; Integer id = getParaToInt(); TbOrder order = getOrder(form, id); if (order == null) return; //当前订单状态 OrderStatus currStatus = OrderStatus.valueOf(order.getStr("status")); if (currStatus.getNumber() <= OrderStatus.DELIVER_GOODS.getNumber()) { //当前状态允许修改 判断值是否变动 OrderAddForm addForm = JSON.parseObject(HttpKit.readData(getRequest()), OrderAddForm.class); boolean isChangeCommodity = checkCommodityIds(addForm.getCommoditys(), id); if (checkContractNo(form, addForm.getContract_no(), order.getInt("id"))) return; //有变动 重置状态 order.setCONSUMER_NAME(addForm.getConsumer_name()); order.setSTATUS(OrderStatus.CREATE.name()); order.setUPDATE_TIME(getNow()); order.setCONTRACT_NO(addForm.getContract_no()); order.update(); if (isChangeCommodity) { //重置订单状态 Db.delete("delete from tb_order_commodity where order_id = " + id); //保存中间表信息 for (OrderCommodityForm orderCommodityForm : addForm.getCommoditys()) { TbOrderCommodity orderCommodity = new TbOrderCommodity(); orderCommodity.put("order_id", id); orderCommodity.put("commodity_id", orderCommodityForm.getId()); orderCommodity.put("number", orderCommodityForm.getNumber()); orderCommodity.save(); } //计算总数量/总金额 setTotalNumberAndTotalMoney(order); } } renderJson(new ApiResp(form)); } private boolean checkCommodityIds(List form, Integer orderId) { if (form == null) return false; List list = TbOrderCommodity.dao.find("SELECT commodity_id,number from tb_order_commodity where order_id = " + orderId); if (list.size() != form.size()) { return true; } Map map = new HashMap<>(); for (TbOrderCommodity commodity : list) { map.put(commodity.getInt("commodity_id"), commodity.getStr("number")); } for (OrderCommodityForm commodityForm : form) { if (map.containsKey(commodityForm.getId())) { String number = map.get(commodityForm.getId()); if (commodityForm.getNumber().equals(number)) { continue; } } return true; } return false; } /** * 获取订单 * * @param form * @param id * @return */ private TbOrder getOrder(ApiForm form, Integer id) { TbOrder order = TbOrder.dao.findById(id); if (order == null) { renderJson(new ApiResp(form).setCode(ApiConstant.CODE_FAIL).setMsg("订单不存在!")); return null; } return order; } /** * 修改订单状态 * * @param currStatus 当前订单状态 * @param form 表单对象 * @param user 用户 * @param order 订单 */ private void changeOrderStatus(OrderStatus currStatus, ApiForm form, SysUser user, TbOrder order) { OrderStatus nextStatus = OrderStatus.nextStatus(currStatus); if (nextStatus == null) { renderJson(new ApiResp(form)); return; } else if (nextStatus.equals(OrderStatus.DELIVER_GOODS)) { //当前用户必须是客户才能执行这一步操作 if (user.getInt("usertype") != JFlyFoxUtils.USER_TYPE_API) { renderJson(new ApiResp<>(form)); return; } } else { //当前用户必须是管理员才能执行这一步操作 if (user.getInt("usertype") != JFlyFoxUtils.USER_TYPE_NORMAL) { renderJson(new ApiResp<>(form)); return; } } if (nextStatus.equals(OrderStatus.BILLING)) { Kv kv = JSON.parseObject(HttpKit.readData(getRequest()), Kv.class); order.setRECEIPT_NUMBER(kv.getStr("receipt_number")); } order.setSTATUS(nextStatus.name()); order.setUPDATE_TIME(getNow()); order.update(); renderJson(new ApiResp(form)); } /** * 删除订单 */ public void delete() { ApiForm form = getBean(ApiForm.class, null); SysUser user = getSysUser(form); if (user == null) return; if (user.getInt("usertype") != JFlyFoxUtils.USER_TYPE_NORMAL) { renderJson(new ApiResp(form).setCode(ApiConstant.CODE_FAIL).setMsg("您不能删除订单!")); return; } Integer id = getParaToInt(); TbOrder order = getOrder(form, id); if (order == null) return; order.delete(); //删除中间表 Db.delete("delete from tb_order_commodity where order_id = " + id); renderJson(new ApiResp(form)); } /** * 获取时间yyyyMMdd格式 * * @return */ private String getTimeStr() { long milliSecond = LocalDateTime.now().toEpochSecond(ZoneOffset.of("+8")); return LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")) + milliSecond; } }