OrderController.java 10.4 KB
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<OrderCommodityForm> form, Integer orderId) {
        if (form == null) return false;
        List<TbOrderCommodity> list = TbOrderCommodity.dao.find("SELECT commodity_id,number from tb_order_commodity where order_id = " + orderId);
        if (list.size() != form.size()) {
            return true;
        }
        Map<Integer, String> 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;
    }


}