Browse Source

add:订单统计

ct 2 days ago
parent
commit
7465005a65

+ 6 - 3
fs-admin/src/main/java/com/fs/store/controller/FsStoreStatisticsController.java

@@ -11,6 +11,7 @@ import com.fs.core.web.service.TokenService;
 import com.fs.store.param.FsStoreStatisticsParam;
 import com.fs.store.service.IFsStoreOrderService;
 import com.fs.store.service.IFsStorePaymentService;
+import com.fs.store.vo.FsStoreOrderCountsVO;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -23,7 +24,7 @@ import java.util.stream.Collectors;
 
 /**
  * 统计
- * 
+ *
  * @author fs
  * @date 2021-03-22
  */
@@ -62,7 +63,7 @@ public class FsStoreStatisticsController extends BaseController
             param.setUsers(userIds.toArray(new Long[userIds.size()]));
         }
         if(param.getUsers()!=null&&param.getUsers().length>0){
-            TimeUtils.TimeEntity timeEntity=TimeUtils.parseTime(param.getType().toString(),param.getStartTime(),param.getEndTime());
+            TimeUtils.TimeEntity timeEntity=TimeUtils.parseTime(param.getType()==null?null:param.getType().toString(),param.getStartTime(),param.getEndTime());
             timeEntity.setUserIds(param.getUsers());
             Integer cycleNum = timeEntity.getCycleNum();
             Integer beginTime = timeEntity.getBeginTime();
@@ -75,7 +76,9 @@ public class FsStoreStatisticsController extends BaseController
             List<String> dates = jsonObjectList.stream().map(jsonObject -> jsonObject.getString("type")).collect(Collectors.toList());
             List<Integer> orderCount = jsonObjectList.stream().map(jsonObject -> jsonObject.getInteger("orderCount")).collect(Collectors.toList());
             List<Integer> payPrice = jsonObjectList.stream().map(jsonObject -> jsonObject.getInteger("payPrice")).collect(Collectors.toList());
-            return R.ok().put("dates",dates).put("orderCount",orderCount).put("payPrice",payPrice);
+            //表格数据
+            List<FsStoreOrderCountsVO> tableData = storeOrderService.selectFsStoreOrderCountsByDept(timeEntity.toMap(),param.getDeptId());
+            return R.ok().put("dates",dates).put("orderCount",orderCount).put("payPrice",payPrice).put("tableData",tableData);
         }
         else {
             return R.ok("未查找到数据");

+ 5 - 2
fs-company-app/src/main/java/com/fs/app/controller/StoreOrderController.java

@@ -180,7 +180,10 @@ public class StoreOrderController extends AppBaseController
     @Login
     @ApiOperation("制单")
     @GetMapping("/createSalesOrder")
-    public R createSalesOrder(@RequestParam("cateIds")String cateIds, HttpServletRequest request){
+    public R createSalesOrder(@RequestParam("cateIds")String cateIds,
+                              @RequestParam(value = "orderType",required = false)Integer orderType,
+                              @RequestParam(value = "orderMedium",required = false)Integer orderMedium,
+                              HttpServletRequest request){
         CompanyUser companyUser=companyUserService.selectCompanyUserById(Long.parseLong(getUserId()));
         if(companyUser==null||companyUser.getDelFlag().equals("1")){
             return R.error("用户不存在");
@@ -188,7 +191,7 @@ public class StoreOrderController extends AppBaseController
         if(!companyUser.getStatus().equals("0")){
             return R.error("用户已禁用");
         }
-        return fsStoreOrderService.createSalesOrder(companyUser,cateIds);
+        return fsStoreOrderService.createSalesOrder(companyUser,cateIds,orderType,orderMedium);
     }
 
     @ApiOperation("改价")

+ 2 - 0
fs-service-system/src/main/java/com/fs/store/mapper/FsStoreOrderMapper.java

@@ -1055,4 +1055,6 @@ public interface FsStoreOrderMapper
      * @return List<OrderStatisticsVo>
      * **/
     List<OrderStatisticsVo> selectOrderSaleStatisticsList(@Param("param") OrderStatisticsParam param);
+
+    List<FsStoreOrderCountsVO> selectFsStoreOrderCountsByDept(Map<String, Object> map);
 }

+ 3 - 1
fs-service-system/src/main/java/com/fs/store/service/IFsStoreOrderService.java

@@ -162,7 +162,7 @@ public interface IFsStoreOrderService
 
     R addTuiMoney(FsStoreOrderAddTuiMoneyParam param);
 
-    R createSalesOrder(CompanyUser companyUser, String cateIds);
+    R createSalesOrder(CompanyUser companyUser, String cateIds,Integer orderType,Integer orderMedium);
 
     R getSalesOrder(String createOrderKey);
 
@@ -233,4 +233,6 @@ public interface IFsStoreOrderService
      * @return List<OrderStatisticsVo>
      * **/
     List<OrderStatisticsVo> selectOrderDimensionStatisticsList(OrderStatisticsParam param);
+
+    List<FsStoreOrderCountsVO> selectFsStoreOrderCountsByDept(Map<String, Object> map,Long deptId);
 }

+ 3 - 1
fs-service-system/src/main/java/com/fs/store/service/impl/FsStoreAfterSalesServiceImpl.java

@@ -53,6 +53,7 @@ import org.springframework.transaction.interceptor.TransactionAspectSupport;
 import java.lang.reflect.Field;
 import java.math.BigDecimal;
 import java.sql.Timestamp;
+import java.text.DecimalFormat;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.time.LocalDateTime;
@@ -617,7 +618,8 @@ public class FsStoreAfterSalesServiceImpl implements IFsStoreAfterSalesService
                         }
                     }else if (payment.getPayMode()!=null&&payment.getPayMode().equals("hf")){
                         V2TradePaymentScanpayRefundRequest request = new V2TradePaymentScanpayRefundRequest();
-                        request.setOrdAmt(refundAmount.toString());
+                        DecimalFormat df = new DecimalFormat("0.00");
+                        request.setOrdAmt(df.format(refundAmount));
                         request.setOrgReqDate(new SimpleDateFormat("yyyyMMdd").format(payment.getCreateTime()));
                         request.setReqSeqId("refund-"+payment.getPayCode());
                         Map<String, Object> extendInfoMap = new HashMap<>();

+ 126 - 3
fs-service-system/src/main/java/com/fs/store/service/impl/FsStoreOrderServiceImpl.java

@@ -25,6 +25,7 @@ import com.fs.company.domain.Company;
 import com.fs.company.domain.CompanyDept;
 import com.fs.company.domain.CompanyMoneyLogs;
 import com.fs.company.domain.CompanyUser;
+import com.fs.company.mapper.CompanyDeptMapper;
 import com.fs.company.mapper.CompanyMapper;
 import com.fs.company.mapper.CompanyMoneyLogsMapper;
 import com.fs.company.service.ICompanyDeptService;
@@ -219,6 +220,8 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService
     private IFsStoreOrderAuditLogService orderAuditLogService;
     @Autowired
     private CompanyMapper companyMapper;
+    @Autowired
+    private CompanyDeptMapper companyDeptMapper;
 
     /**
      * 查询订单
@@ -618,8 +621,15 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService
             if (storeOrder.getCustomerId() == null){
                 storeOrder.setCustomerId(param.getCustomerId());//6.13 添加客户id
             }
-            storeOrder.setOrderType(param.getOrderType());
-            storeOrder.setOrderMedium(param.getOrderMedium());
+            FsStoreOrder tempOrder = redisCache.getCacheObject("orderInfo:" + param.getCreateOrderKey());
+            if (tempOrder != null){
+                storeOrder.setOrderType(tempOrder.getOrderType());
+                storeOrder.setOrderMedium(tempOrder.getOrderMedium());
+                redisCache.deleteObject("orderInfo:" + param.getCreateOrderKey());
+            } else {
+                storeOrder.setOrderType(param.getOrderType());
+                storeOrder.setOrderMedium(param.getOrderMedium());
+            }
             Integer flag=fsStoreOrderMapper.insertFsStoreOrder(storeOrder);
             if (flag==0) {
                 return R.error("订单创建失败");
@@ -1979,11 +1989,20 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService
     }
 
     @Override
-    public R createSalesOrder(CompanyUser companyUser, String cateIds) {
+    public R createSalesOrder(CompanyUser companyUser, String cateIds,Integer orderType,Integer orderMedium) {
         List<FsStoreCartQueryVO>  carts=cartMapper.selectFsStoreCartListByIds(cateIds);
         String uuid = IdUtil.randomUUID();
         redisCache.setCacheObject("createOrderKey:"+uuid, companyUser.getCompanyId()+"-"+companyUser.getUserId(), 24, TimeUnit.HOURS);
         redisCache.setCacheObject("orderCarts:"+uuid, carts, 24, TimeUnit.HOURS);
+
+        //2025.7.23 倍力优需求 制单添加订单类型,媒体来源(非必填)
+        if (orderType != null || orderMedium != null) {
+            FsStoreOrder fsStoreOrder = new FsStoreOrder();
+            fsStoreOrder.setOrderMedium(orderMedium);
+            fsStoreOrder.setOrderType(orderType);
+            redisCache.setCacheObject("orderInfo:"+uuid, fsStoreOrder, 24, TimeUnit.HOURS);
+        }
+
         //计算总价
         BigDecimal totalMoney= BigDecimal.ZERO;
         for(FsStoreCartQueryVO vo:carts){
@@ -2684,4 +2703,108 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService
 //            return fsStoreOrderMapper.selectOrderDimensionStatisticsList(param);
 //        }
     }
+
+    @Override
+    public List<FsStoreOrderCountsVO> selectFsStoreOrderCountsByDept(Map<String, Object> map,Long deptId) {
+        List<FsStoreOrderCountsVO> vos = fsStoreOrderMapper.selectFsStoreOrderCountsByDept(map);
+        if (!vos.isEmpty()){
+            List<FsStoreOrderCountsVO> totalVos = new ArrayList<>();
+            //查询组名
+            List<CompanyDept> companyDeptList = companyDeptMapper.selectChildrenDeptById(deptId);
+            if (companyDeptList.isEmpty()) {
+                CompanyDept companyDept = companyDeptMapper.selectCompanyDeptById(deptId);
+                FsStoreOrderCountsVO vo = addTotal(companyDept, vos,true);
+                totalVos.add(vo);
+            } else {
+                for (CompanyDept companyDept : companyDeptList) {
+                    FsStoreOrderCountsVO vo = addTotal(companyDept, vos,false);
+                    totalVos.add(vo);
+                }
+            }
+            vos.addAll(totalVos);
+        }
+        return vos;
+    }
+
+    private FsStoreOrderCountsVO addTotal(CompanyDept companyDept, List<FsStoreOrderCountsVO> vos,boolean isEmpty) {
+        FsStoreOrderCountsVO vo = new FsStoreOrderCountsVO();
+        Long totalCalls = 0L;
+        BigDecimal totalAmount = BigDecimal.ZERO;
+        BigDecimal validAmount = BigDecimal.ZERO;
+        Long waitingOrders = 0L;
+        BigDecimal waitingAmount = BigDecimal.ZERO;
+        Long unPassedOrders = 0L;
+        BigDecimal unPassedAmount = BigDecimal.ZERO;
+        Long cancelOrders = 0L;
+        BigDecimal cancelAmount = BigDecimal.ZERO;
+        Long unshippedOrders = 0L;
+        BigDecimal unshippedAmount = BigDecimal.ZERO;
+        Long shippedOrders = 0L;
+        BigDecimal shippedAmount = BigDecimal.ZERO;
+        Long transitOrders = 0L;
+        BigDecimal transitAmount = BigDecimal.ZERO;
+        Long receivedOrders = 0L;
+        BigDecimal receivedAmount = BigDecimal.ZERO;
+        Long returnOrders = 0L;
+        BigDecimal returnAmount = BigDecimal.ZERO;
+        Long paybackOrders = 0L;
+        BigDecimal paybackAmount = BigDecimal.ZERO;
+        vo.setName("组名:"+ companyDept.getDeptName());
+        Long deptId = companyDept.getDeptId();
+        vo.setDeptId(deptId);
+        for (FsStoreOrderCountsVO orderCountsVO : vos) {
+            if (!isEmpty){
+                if (!Objects.equals(deptId, orderCountsVO.getDeptId())) {
+                    continue;
+                }
+            }
+            orderCountsVO.setIsGroup(false);
+            orderCountsVO.setGroupName(companyDept.getDeptName());
+            totalCalls = totalCalls + orderCountsVO.getTotalCalls();
+            totalAmount = totalAmount.add(orderCountsVO.getTotalAmount());
+            validAmount = validAmount.add(orderCountsVO.getValidAmount());
+            waitingOrders = waitingOrders + orderCountsVO.getWaitingOrders();
+            waitingAmount = waitingAmount.add(orderCountsVO.getWaitingAmount());
+            unPassedOrders = unPassedOrders + orderCountsVO.getUnPassedOrders();
+            unPassedAmount = unPassedAmount.add(orderCountsVO.getUnPassedAmount());
+            cancelOrders = cancelOrders + orderCountsVO.getCancelOrders();
+            cancelAmount = cancelAmount.add(orderCountsVO.getCancelAmount());
+            unshippedOrders = unshippedOrders + orderCountsVO.getUnshippedOrders();
+            unshippedAmount = unshippedAmount.add(orderCountsVO.getUnshippedAmount());
+            shippedOrders = shippedOrders + orderCountsVO.getShippedOrders();
+            shippedAmount = shippedAmount.add(orderCountsVO.getShippedAmount());
+            transitOrders = transitOrders + orderCountsVO.getTransitOrders();
+            transitAmount = transitAmount.add(orderCountsVO.getTransitAmount());
+            receivedOrders = receivedOrders + orderCountsVO.getReceivedOrders();
+            receivedAmount = receivedAmount.add(orderCountsVO.getReceivedAmount());
+            returnOrders = returnOrders + orderCountsVO.getReturnOrders();
+            returnAmount = returnAmount.add(orderCountsVO.getReturnAmount());
+            paybackOrders = paybackOrders + orderCountsVO.getPaybackOrders();
+            paybackAmount = paybackAmount.add(orderCountsVO.getPaybackAmount());
+        }
+        vo.setTotalCalls(totalCalls);
+        vo.setTotalAmount(totalAmount);
+        vo.setValidAmount(validAmount);
+        vo.setWaitingOrders(waitingOrders);
+        vo.setWaitingAmount(waitingAmount);
+        vo.setUnPassedOrders(unPassedOrders);
+        vo.setUnPassedAmount(unPassedAmount);
+        vo.setCancelOrders(cancelOrders);
+        vo.setCancelAmount(cancelAmount);
+        vo.setUnshippedOrders(unshippedOrders);
+        vo.setUnshippedAmount(unshippedAmount);
+        vo.setShippedOrders(shippedOrders);
+        vo.setShippedAmount(shippedAmount);
+        vo.setTransitOrders(transitOrders);
+        vo.setTransitAmount(transitAmount);
+        vo.setReceivedOrders(receivedOrders);
+        vo.setReceivedAmount(receivedAmount);
+        vo.setReturnOrders(returnOrders);
+        vo.setReturnAmount(returnAmount);
+        vo.setPaybackOrders(paybackOrders);
+        vo.setPaybackAmount(paybackAmount);
+        vo.setIsGroup(true);
+        vo.setGroupName(companyDept.getDeptName());
+        return vo;
+    }
 }

+ 58 - 0
fs-service-system/src/main/java/com/fs/store/vo/FsStoreOrderCountsVO.java

@@ -0,0 +1,58 @@
+package com.fs.store.vo;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+public class FsStoreOrderCountsVO {
+    private Long deptId; //不显示
+    //员工名字[id] / 部门:部门名称
+    private String name;
+    //总单数
+    private Long totalCalls;
+    //总金额
+    private BigDecimal totalAmount;
+    //成单金额
+    private BigDecimal validAmount;
+    //待审核订单数
+    private Long waitingOrders;
+    //待审核付金额
+    private BigDecimal waitingAmount;
+    //审核未过订单数
+    private Long unPassedOrders;
+    //审核未过金额
+    private BigDecimal unPassedAmount;
+    //取消订单数
+    private Long cancelOrders;
+    //取消金额
+    private BigDecimal cancelAmount;
+    //成交未发货订单数
+    private Long unshippedOrders;
+    //成交未发货金额
+    private BigDecimal unshippedAmount;
+    //发货订单数
+    private Long shippedOrders;
+    //发货金额
+    private BigDecimal shippedAmount;
+    //在途订单数
+    private Long transitOrders;
+    //在途金额
+    private BigDecimal transitAmount;
+    //签收订单数
+    private Long receivedOrders;
+    //签收金额
+    private BigDecimal receivedAmount;
+    //退货订单数
+    private Long returnOrders;
+    //退货金额
+    private BigDecimal returnAmount;
+    //回款订单数
+    private Long paybackOrders;
+    //回款金额
+    private BigDecimal paybackAmount;
+    //是否是组汇总
+    private Boolean isGroup;
+    //组名
+    private String groupName;
+}

+ 57 - 0
fs-service-system/src/main/resources/mapper/store/FsStoreOrderMapper.xml

@@ -764,4 +764,61 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         ) a ORDER BY
         a.company_id DESC,a.totalNum DESC
     </select>
+    <select id="selectFsStoreOrderCountsByDept" resultType="com.fs.store.vo.FsStoreOrderCountsVO">
+        SELECT
+        o.dept_id,
+        CONCAT(o.nick_name, '[', o.company_user_id, ']') AS name,
+
+        COUNT(*) AS totalCalls,
+        SUM(o.pay_price) AS totalAmount,
+
+        SUM(CASE WHEN o.status IN (3,4,5) THEN o.pay_price ELSE 0 END) AS validAmount,
+
+        COUNT(CASE WHEN o.is_pay_remain = 1 THEN 1 END) AS waitingOrders,
+        SUM(CASE WHEN o.is_pay_remain = 1 THEN o.pay_price ELSE 0 END) AS waitingAmount,
+
+        COUNT(CASE WHEN o.is_pay_remain = 2 THEN 1 END) AS unPassedOrders,
+        SUM(CASE WHEN o.is_pay_remain = 2 THEN o.pay_price ELSE 0 END) AS unPassedAmount,
+
+        COUNT(CASE WHEN o.status IN (-1, -2) THEN 1 END) AS cancelOrders,
+        SUM(CASE WHEN o.status IN (-1, -2) THEN o.pay_price ELSE 0 END) AS cancelAmount,
+
+        COUNT(CASE WHEN o.status = 2 THEN 1 END) AS unshippedOrders,
+        SUM(CASE WHEN o.status = 2 THEN o.pay_price ELSE 0 END) AS unshippedAmount,
+
+        COUNT(CASE WHEN o.status = 3 THEN 1 END) AS shippedOrders,
+        SUM(CASE WHEN o.status = 3 THEN o.pay_price ELSE 0 END) AS shippedAmount,
+
+        COUNT(CASE WHEN o.delivery_status = 1 THEN 1 END) AS transitOrders,
+        SUM(CASE WHEN o.delivery_status = 1 THEN o.pay_price ELSE 0 END) AS transitAmount,
+
+        COUNT(CASE WHEN o.status IN (4,5) THEN 1 END) AS receivedOrders,
+        SUM(CASE WHEN o.status IN (4,5) THEN o.pay_price ELSE 0 END) AS receivedAmount,
+
+        COUNT(CASE WHEN o.refund_status = 2 THEN 1 END) AS returnOrders,
+        SUM(CASE WHEN o.refund_status = 2 THEN o.refund_price ELSE 0 END) AS returnAmount,
+
+        COUNT(CASE WHEN o.delivery_pay_status = 1 THEN 1 END) AS paybackOrders,
+        SUM(CASE WHEN o.delivery_pay_status = 1 THEN o.delivery_pay_money ELSE 0 END) AS paybackAmount
+
+        FROM
+        (
+        SELECT so.*,u.nick_name
+        FROM
+        fs_store_order AS so
+        LEFT JOIN company_user u ON so.company_user_id = u.user_id
+        where
+        (DATE_FORMAT(so.create_time,#{sqlDateFormat}) between #{beginTime} and #{finalTime})
+            <if test="userIds != null and userIds.length>0">AND so.company_user_id IN
+                <foreach item
+            ="item" collection="userIds" open="(" separator="," close=")">
+                    #{item}
+                </foreach>
+            </if>
+            <if test="companyId != null  ">
+                AND so.company_id = #{companyId}
+            </if>
+
+        ) o GROUP BY o.company_user_id
+    </select>
 </mapper>

+ 3 - 3
fs-service-system/src/main/resources/mapper/store/FsStoreProductMapper.xml

@@ -114,9 +114,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test = 'companyIds != null and companyIds != "" '>
                 and find_in_set(#{companyIds}, company_ids)
             </if>
-            <if test="companyUserId != null">
-                and
-            </if>
+<!--            <if test="companyUserId != null">-->
+<!--                and-->
+<!--            </if>-->
         </where>
     </select>
 

+ 5 - 1
fs-user-app/src/main/java/com/fs/app/controller/CommonController.java

@@ -463,6 +463,8 @@ public class CommonController extends AppBaseController {
 		List<DictVO> storeAfterSalesStatus=dictDataService.selectDictDataListByType("store_after_sales_status");
 		List<DictVO> storeProductPackageCate=dictDataService.selectDictDataListByType("store_product_package_cate");
 		List<DictVO> storeProductTuiCate=dictDataService.selectDictDataListByType("store_product_tui_cate");
+		List<DictVO> storeOrderType=dictDataService.selectDictDataListByType("store_order_type");
+		List<DictVO> storeOrderMedium=dictDataService.selectDictDataListByType("store_order_medium");
 		return R.ok()
 				.put("storeProductPackageCate",storeProductPackageCate)
 				.put("storeAfterSalesStatus",storeAfterSalesStatus)
@@ -472,7 +474,9 @@ public class CommonController extends AppBaseController {
 				.put("doctorOrderStatus",doctorOrderStatus)
 				.put("storeOrderStatus", storeOrderStatus)
 				.put("storeAfterSalesReasons", storeAfterSalesReasons)
-				.put("storeProductTuiCate",storeProductTuiCate);
+				.put("storeProductTuiCate",storeProductTuiCate)
+				.put("storeOrderType",storeOrderType)
+				.put("storeOrderMedium",storeOrderMedium);
 	}
 
 	@GetMapping(value = "/getStoreConfig")

+ 6 - 2
fs-user-app/src/main/java/com/fs/app/controller/CompanyOrderController.java

@@ -61,7 +61,11 @@ public class CompanyOrderController extends  AppBaseController {
     @Login
     @ApiOperation("制单")
     @GetMapping("/createSalesOrder")
-    public R createSalesOrder(@RequestParam("token")String token,@RequestParam("cateIds")String cateIds, HttpServletRequest request){
+    public R createSalesOrder(@RequestParam("token")String token,
+                              @RequestParam("cateIds")String cateIds,
+                              @RequestParam(value = "orderType",required = false)Integer orderType,
+                              @RequestParam(value = "orderMedium",required = false)Integer orderMedium,
+                              HttpServletRequest request){
         Long userId=redisCache.getCacheObject("company-user-token:"+token);
         if(userId==null){
             return R.error(403,"用户失效");
@@ -73,7 +77,7 @@ public class CompanyOrderController extends  AppBaseController {
         if(!companyUser.getStatus().equals("0")){
             return R.error("用户已禁用");
         }
-        return orderService.createSalesOrder(companyUser,cateIds);
+        return orderService.createSalesOrder(companyUser,cateIds,orderType,orderMedium);
     }
 
     @ApiOperation("改价")