Merge branch 'master' of http://139.186.142.91:10010/r/productDev/gtzxinglijicun
| | |
| | | { |
| | | "permissions": { |
| | | "allow": [ |
| | | "WebSearch" |
| | | "WebSearch", |
| | | "Bash(mvn package *)", |
| | | "Bash(curl -s -X POST \"https://api.hydzfp.com/server/index.php?s=/api/page/info\" -d \"page_id=17\")", |
| | | "Bash(curl -s -X POST \"https://api.hydzfp.com/server/index.php?s=/api/page/info\" -d \"page_id=20\")" |
| | | ], |
| | | "additionalDirectories": [ |
| | | "d:\\DouMee\\javaCodeGit\\gtzxinglijicun\\server\\services\\src\\main\\java\\com\\doumee\\core\\utils" |
| | |
| | | package com.doumee.api.business; |
| | | |
| | | import com.doumee.api.BaseController; |
| | | import com.doumee.core.annotation.excel.ExcelExporter; |
| | | import com.doumee.core.model.ApiResponse; |
| | | import com.doumee.dao.dto.DataBoardQueryDTO; |
| | | import com.doumee.dao.dto.FinanceQueryDTO; |
| | | import com.doumee.dao.dto.TrendQueryDTO; |
| | | import com.doumee.dao.vo.*; |
| | | import com.doumee.service.business.DataBoardService; |
| | | import io.swagger.annotations.Api; |
| | |
| | | import org.springframework.web.bind.annotation.RequestMapping; |
| | | import org.springframework.web.bind.annotation.RestController; |
| | | |
| | | import javax.servlet.http.HttpServletResponse; |
| | | import java.text.SimpleDateFormat; |
| | | import java.util.Date; |
| | | import java.util.List; |
| | | |
| | | @Api(tags = "æ°æ®çæ¿") |
| | |
| | | return ApiResponse.success(dataBoardService.overview(query)); |
| | | } |
| | | |
| | | @ApiOperation("è¿30天ä¼å注åè¶å¿") |
| | | @ApiOperation("ä¼å注åè¶å¿") |
| | | @PostMapping("/memberTrend") |
| | | public ApiResponse<List<MemberTrendVO>> memberTrend() { |
| | | return ApiResponse.success(dataBoardService.memberTrend()); |
| | | public ApiResponse<List<MemberTrendVO>> memberTrend(@RequestBody TrendQueryDTO query) { |
| | | return ApiResponse.success(dataBoardService.memberTrend(query)); |
| | | } |
| | | |
| | | @ApiOperation("è¿30天订åè¶å¿") |
| | | @ApiOperation("订åè¶å¿") |
| | | @PostMapping("/orderTrend") |
| | | public ApiResponse<List<OrderTrendVO>> orderTrend() { |
| | | return ApiResponse.success(dataBoardService.orderTrend()); |
| | | public ApiResponse<List<OrderTrendVO>> orderTrend(@RequestBody TrendQueryDTO query) { |
| | | return ApiResponse.success(dataBoardService.orderTrend(query)); |
| | | } |
| | | |
| | | @ApiOperation("è¿30å¤©è¥æ¶è¶å¿") |
| | | @ApiOperation("è¥æ¶è¶å¿") |
| | | @PostMapping("/revenueTrend") |
| | | public ApiResponse<List<RevenueTrendVO>> revenueTrend() { |
| | | return ApiResponse.success(dataBoardService.revenueTrend()); |
| | | public ApiResponse<List<RevenueTrendVO>> revenueTrend(@RequestBody TrendQueryDTO query) { |
| | | return ApiResponse.success(dataBoardService.revenueTrend(query)); |
| | | } |
| | | |
| | | @ApiOperation("é¨åºä¸ç»©ç»è®¡") |
| | |
| | | public ApiResponse<ShopPerformanceVO> shopPerformance(@RequestBody DataBoardQueryDTO query) { |
| | | return ApiResponse.success(dataBoardService.shopPerformance(query)); |
| | | } |
| | | |
| | | @ApiOperation("è¡æç±»åå æ¯å¯¼åº") |
| | | @PostMapping("/luggageTypeExport") |
| | | public void luggageTypeExport(@RequestBody DataBoardQueryDTO query, HttpServletResponse response) { |
| | | ExcelExporter.build(LuggageTypeItem.class) |
| | | .export(dataBoardService.luggageTypeList(query), "è¡æç±»åå æ¯", response); |
| | | } |
| | | |
| | | @ApiOperation("å¹³å°è´¢å¡æ»è§") |
| | | @PostMapping("/financeOverview") |
| | | public ApiResponse<List<FinanceOverviewVO>> financeOverview(@RequestBody FinanceQueryDTO query) { |
| | | return ApiResponse.success(dataBoardService.financeOverview(query)); |
| | | } |
| | | |
| | | @ApiOperation("å¹³å°è´¢å¡æ»è§å¯¼åº") |
| | | @PostMapping("/financeOverviewExport") |
| | | public void financeOverviewExport(@RequestBody FinanceQueryDTO query, HttpServletResponse response) { |
| | | String fileName = "å¹³å°è´¢å¡æ°æ®æ¥è¡¨_" + new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()); |
| | | ExcelExporter.build(FinanceOverviewVO.class) |
| | | .export(dataBoardService.financeOverview(query), fileName, response); |
| | | } |
| | | |
| | | @ApiOperation("é¨åºä¸ç»©Top10") |
| | | @PostMapping("/shopTop") |
| | | public ApiResponse<List<ShopTopVO>> shopTop(@RequestBody TrendQueryDTO query) { |
| | | return ApiResponse.success(dataBoardService.shopTop(query)); |
| | | } |
| | | |
| | | @ApiOperation("叿ºä¸ç»©Top10") |
| | | @PostMapping("/driverTop") |
| | | public ApiResponse<List<DriverTopVO>> driverTop(@RequestBody TrendQueryDTO query) { |
| | | return ApiResponse.success(dataBoardService.driverTop(query)); |
| | | } |
| | | } |
| | |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | | import javax.servlet.http.HttpServletResponse; |
| | | import java.text.SimpleDateFormat; |
| | | import java.util.ArrayList; |
| | | import java.util.Date; |
| | | import java.util.List; |
| | | |
| | | /** |
| | |
| | | @RequiresPermissions("business:driverInfo:exportExcel") |
| | | public void exportExcel(@RequestBody PageWrap<DriverInfo> pageWrap, HttpServletResponse response) { |
| | | List<DriverInfo> driverInfoList = driverInfoService.findPage(pageWrap).getRecords(); |
| | | ExcelExporter.build(DriverInfo.class).export(driverInfoList, "叿ºæ³¨åä¿¡æ¯", response); |
| | | String fileName = "叿ºç®¡ç导åº_" + new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()); |
| | | ExcelExporter.build(DriverInfo.class).export(driverInfoList, fileName, response); |
| | | } |
| | | |
| | | @ApiOperation("æ ¹æ®IDæ¥è¯¢") |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.doumee.api.business; |
| | | |
| | | import com.doumee.api.BaseController; |
| | | import com.doumee.core.annotation.pr.PreventRepeat; |
| | | import com.doumee.core.model.ApiResponse; |
| | | import com.doumee.core.model.PageData; |
| | | import com.doumee.core.model.PageWrap; |
| | | import com.doumee.dao.business.model.InvoiceRecord; |
| | | import com.doumee.dao.vo.InvoiceRecordSummaryVO; |
| | | import com.doumee.service.business.InvoiceRecordService; |
| | | import io.swagger.annotations.Api; |
| | | import io.swagger.annotations.ApiOperation; |
| | | import org.apache.shiro.authz.annotation.RequiresPermissions; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | | import java.util.ArrayList; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * å票ç³è¯·è®°å½ç®¡ç |
| | | * |
| | | * @author rk |
| | | * @date 2026/05/18 |
| | | */ |
| | | @Api(tags = "å票ç³è¯·è®°å½") |
| | | @RestController |
| | | @RequestMapping("/business/invoiceRecord") |
| | | public class InvoiceRecordController extends BaseController { |
| | | |
| | | @Autowired |
| | | private InvoiceRecordService invoiceRecordService; |
| | | |
| | | @PreventRepeat |
| | | @ApiOperation("æ°å»º") |
| | | @PostMapping("/create") |
| | | @RequiresPermissions("business:invoiceRecord:create") |
| | | public ApiResponse create(@RequestBody InvoiceRecord invoiceRecord) { |
| | | return ApiResponse.success(invoiceRecordService.create(invoiceRecord)); |
| | | } |
| | | |
| | | @ApiOperation("æ ¹æ®IDå é¤") |
| | | @GetMapping("/delete/{id}") |
| | | @RequiresPermissions("business:invoiceRecord:delete") |
| | | public ApiResponse deleteById(@PathVariable Integer id) { |
| | | invoiceRecordService.deleteById(id); |
| | | return ApiResponse.success(null); |
| | | } |
| | | |
| | | @ApiOperation("æ¹éå é¤") |
| | | @GetMapping("/delete/batch") |
| | | @RequiresPermissions("business:invoiceRecord:delete") |
| | | public ApiResponse deleteByIdInBatch(@RequestParam String ids) { |
| | | String[] idArray = ids.split(","); |
| | | List<Integer> idList = new ArrayList<>(); |
| | | for (String id : idArray) { |
| | | idList.add(Integer.valueOf(id)); |
| | | } |
| | | invoiceRecordService.deleteByIdInBatch(idList); |
| | | return ApiResponse.success(null); |
| | | } |
| | | |
| | | @ApiOperation("æ ¹æ®IDä¿®æ¹") |
| | | @PostMapping("/updateById") |
| | | @RequiresPermissions("business:invoiceRecord:update") |
| | | public ApiResponse updateById(@RequestBody InvoiceRecord invoiceRecord) { |
| | | invoiceRecordService.updateById(invoiceRecord); |
| | | return ApiResponse.success(null); |
| | | } |
| | | |
| | | @ApiOperation("å页æ¥è¯¢") |
| | | @PostMapping("/page") |
| | | public ApiResponse<PageData<InvoiceRecord>> findPage(@RequestBody PageWrap<InvoiceRecord> pageWrap) { |
| | | return ApiResponse.success(invoiceRecordService.findPage(pageWrap)); |
| | | } |
| | | |
| | | @ApiOperation("æ ¹æ®IDæ¥è¯¢") |
| | | @GetMapping("/{id}") |
| | | public ApiResponse findById(@PathVariable Integer id) { |
| | | return ApiResponse.success(invoiceRecordService.findById(id)); |
| | | } |
| | | |
| | | @ApiOperation("å票ç»è®¡æ±æ»") |
| | | @PostMapping("/summary") |
| | | public ApiResponse<InvoiceRecordSummaryVO> summary(@RequestBody PageWrap<InvoiceRecord> pageWrap) { |
| | | return ApiResponse.success(invoiceRecordService.findPageSummary(pageWrap)); |
| | | } |
| | | } |
| | |
| | | |
| | | import com.doumee.api.BaseController; |
| | | import com.doumee.core.annotation.excel.ExcelExporter; |
| | | import com.doumee.core.constants.Constants; |
| | | import com.doumee.core.model.ApiResponse; |
| | | import com.doumee.core.model.PageData; |
| | | import com.doumee.core.model.PageWrap; |
| | | import com.doumee.dao.business.model.Orders; |
| | | import com.doumee.dao.dto.ConfirmArriveDTO; |
| | | import com.doumee.core.annotation.pr.PreventRepeat; |
| | | import com.doumee.dao.dto.DispatchDTO; |
| | | import com.doumee.dao.dto.HandleOrderExceptionDTO; |
| | | import com.doumee.dao.dto.ManualRefundDTO; |
| | | import com.doumee.dao.vo.OrderDetailVO; |
| | | import com.doumee.dao.vo.OrderDispatchVO; |
| | | import com.doumee.dao.vo.OrdersExportVO; |
| | | import com.doumee.dao.vo.OrderSummaryVO; |
| | | import com.doumee.service.business.OrdersService; |
| | | import io.swagger.annotations.Api; |
| | | import io.swagger.annotations.ApiOperation; |
| | | import org.apache.commons.lang3.StringUtils; |
| | | import org.apache.shiro.authz.annotation.RequiresPermissions; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | | import javax.servlet.http.HttpServletResponse; |
| | | import javax.validation.Valid; |
| | | import java.text.SimpleDateFormat; |
| | | import java.util.ArrayList; |
| | | import java.util.Date; |
| | | import java.util.List; |
| | | import java.util.Objects; |
| | | |
| | | /** |
| | | * å¯å订å管ç |
| | |
| | | @PostMapping("/exportExcel") |
| | | @RequiresPermissions("business:orders:exportExcel") |
| | | public void exportExcel(@RequestBody PageWrap<Orders> pageWrap, HttpServletResponse response) { |
| | | ExcelExporter.build(Orders.class).export(ordersService.findPage(pageWrap).getRecords(), "å¯å订å", response); |
| | | List<Orders> records = ordersService.findPage(pageWrap).getRecords(); |
| | | List<OrdersExportVO> exportList = new ArrayList<>(); |
| | | for (Orders o : records) { |
| | | OrdersExportVO vo = new OrdersExportVO(); |
| | | vo.setCode(o.getCode()); |
| | | vo.setGoodsInfo(o.getGoodsInfo()); |
| | | vo.setTypeName(o.getType() != null ? (o.getType() == 0 ? "å°±å°åå" : "å¼å°åå") : ""); |
| | | vo.setOrderLevel(Constants.getDriverLevelName(Objects.nonNull(o.getOrderLevel())?Integer.valueOf(o.getOrderLevel()):Constants.ZERO)); |
| | | vo.setDeclaredFee(String.valueOf(Constants.getFormatMoney(o.getDeclaredFee()))); |
| | | vo.setBasicAmount(String.valueOf(Constants.getFormatMoney(o.getBasicAmount()))); |
| | | vo.setTotalAmount(String.valueOf(Constants.getFormatMoney(o.getTotalAmount()))); |
| | | vo.setPayAmount(String.valueOf(Constants.getFormatMoney(o.getPayAmount()))); |
| | | vo.setUrgentAmount(String.valueOf(Constants.getFormatMoney(o.getUrgentAmount()))); |
| | | vo.setRefundAmount(String.valueOf(Constants.getFormatMoney(o.getRefundAmount()))); |
| | | vo.setOverdueAmount(String.valueOf(Constants.getFormatMoney(o.getOverdueAmount()))); |
| | | vo.setExceptionAmount(String.valueOf(Constants.getFormatMoney(o.getExceptionAmount()))); |
| | | vo.setDeductionAmount(String.valueOf(Constants.getFormatMoney(o.getDeductionAmount()))); |
| | | vo.setStatusDesc(o.getStatusDesc()); |
| | | vo.setSettlementDesc(o.getSettlementStatus() != null ? (o.getSettlementStatus() == 1 ? "å·²ç»ç®" : "å¾
ç»ç®") : ""); |
| | | vo.setPayTime(o.getPayTime()); |
| | | vo.setCreateTime(o.getCreateTime()); |
| | | exportList.add(vo); |
| | | } |
| | | String fileName = "订å管ç导åº_" + new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()); |
| | | ExcelExporter.build(OrdersExportVO.class).export(exportList, fileName, response); |
| | | } |
| | | |
| | | @ApiOperation("æ ¹æ®IDæ¥è¯¢") |
| | |
| | | return ApiResponse.success("ç»ç®å®æ"); |
| | | } |
| | | |
| | | @ApiOperation("æå¨é款") |
| | | @PostMapping("/manualRefund") |
| | | @RequiresPermissions("business:orders:update") |
| | | @PreventRepeat |
| | | public ApiResponse manualRefund(@RequestBody @Valid ManualRefundDTO dto) { |
| | | ordersService.manualRefund(dto, this.getLoginUser().getId()); |
| | | return ApiResponse.success("æä½æå"); |
| | | } |
| | | |
| | | @PreventRepeat |
| | | @ApiOperation("订åå¼å¸¸å¤ç") |
| | | @PostMapping("/handleException") |
| | | @RequiresPermissions("business:orders:update") |
| | | public ApiResponse handleException(@RequestBody @Valid HandleOrderExceptionDTO dto) { |
| | | ordersService.handleOrderException(dto); |
| | | return ApiResponse.success("æä½æå"); |
| | | } |
| | | |
| | | } |
| | |
| | | -- æ°æ®åºåæ´èæ¬ï¼å
¨é¨åæ´ç»ä¸è®°å½å¨æ¤æä»¶ï¼ |
| | | -- ææ¥æååºæåï¼æ¯æ¬¡åæ´ç¨æ¥ææ³¨éååé |
| | | -- ============================================================ |
| | | -- 2026/05/18 è¿è¥é
ç½®å¢å å票å¼å
·æä»½éå¶ |
| | | -- ============================================================ |
| | | INSERT INTO `system_dict_data` (`DICT_ID`, `CODE`, `LABEL`, `REMARK`, `SORT`, `DISABLED`, `CREATE_USER`, `CREATE_TIME`, `DELETED`) |
| | | VALUES ((SELECT `id` FROM `system_dict` WHERE `code` = 'OPERATION_CONFIG'), '12', 'INVOICE_MONTH_LIMIT', 'å票å¼å
·æä»½éå¶ï¼æï¼', 0, 0, 1, NOW(), 0); |
| | | |
| | | -- ============================================================ |
| | | -- 2026/05/18 è¿è¥é
ç½®å¢å 注åå®æè®¢åå¥å±ãå¹³å°å®æè®¢åå¥å± |
| | | -- ============================================================ |
| | | INSERT INTO `system_dict_data` (`DICT_ID`, `CODE`, `LABEL`, `REMARK`, `SORT`, `DISABLED`, `CREATE_USER`, `CREATE_TIME`, `DELETED`) |
| | | VALUES ((SELECT `id` FROM `system_dict` WHERE `code` = 'OPERATION_CONFIG'), '0', 'REGISTER_REWARD_ORDER_COUNT', '注åå®æè®¢åå¥å±åæ°', 0, 0, 1, NOW(), 0); |
| | | INSERT INTO `system_dict_data` (`DICT_ID`, `CODE`, `LABEL`, `REMARK`, `SORT`, `DISABLED`, `CREATE_USER`, `CREATE_TIME`, `DELETED`) |
| | | VALUES ((SELECT `id` FROM `system_dict` WHERE `code` = 'OPERATION_CONFIG'), '0', 'REGISTER_REWARD_AMOUNT', '注åå®æè®¢åå¥å±éé¢ï¼åï¼', 0, 0, 1, NOW(), 0); |
| | | INSERT INTO `system_dict_data` (`DICT_ID`, `CODE`, `LABEL`, `REMARK`, `SORT`, `DISABLED`, `CREATE_USER`, `CREATE_TIME`, `DELETED`) |
| | | VALUES ((SELECT `id` FROM `system_dict` WHERE `code` = 'OPERATION_CONFIG'), '0', 'PLATFORM_REWARD_ORDER_COUNT', 'å¹³å°å®æè®¢åå¥å±åæ°', 0, 0, 1, NOW(), 0); |
| | | INSERT INTO `system_dict_data` (`DICT_ID`, `CODE`, `LABEL`, `REMARK`, `SORT`, `DISABLED`, `CREATE_USER`, `CREATE_TIME`, `DELETED`) |
| | | VALUES ((SELECT `id` FROM `system_dict` WHERE `code` = 'OPERATION_CONFIG'), '0', 'PLATFORM_REWARD_AMOUNT', 'å¹³å°å®æè®¢åå¥å±éé¢ï¼åï¼', 0, 0, 1, NOW(), 0); |
| | | |
| | | -- ============================================================ |
| | | -- 2026/05/18 订å表å¢å é¨åºå¼å¸¸è¡¥å¿éé¢å段 |
| | | -- ============================================================ |
| | | ALTER TABLE `orders` ADD COLUMN `SHOP_COMPENSATION_AMOUNT` bigint DEFAULT NULL COMMENT 'é¨åºå¼å¸¸è¡¥å¿éé¢ï¼åï¼' AFTER `INVOICE_STATUS`; |
| | | |
| | | -- ============================================================ |
| | | -- 2026/05/18 å票记å½è¡¨å¢å å票å·ç ã订åç¼å·ãå¼ç¥¨é®ç®±ãå票PDF keyåæ®µ |
| | | -- ============================================================ |
| | | ALTER TABLE `invoice_record` ADD COLUMN `ORDER_NO` varchar(50) DEFAULT NULL COMMENT '订åç¼å·' AFTER `MEMBER_ID`; |
| | | ALTER TABLE `invoice_record` ADD COLUMN `INVOICE_NO` varchar(50) DEFAULT NULL COMMENT 'å票å·ç ' AFTER `ORDER_NO`; |
| | | ALTER TABLE `invoice_record` ADD COLUMN `EMAIL` varchar(100) DEFAULT NULL COMMENT 'å¼ç¥¨é®ç®±' AFTER `FILE_ADDR`; |
| | | ALTER TABLE `invoice_record` ADD COLUMN `INVOICE_PDF_KEY` varchar(200) DEFAULT NULL COMMENT 'å票PDFæä»¶KEY' AFTER `EMAIL`; |
| | | |
| | | -- ============================================================ |
| | | -- 2026/05/18 订åå¢å åç¥¨ç¶æåæ®µ & å票ç³è¯·è®°å½è¡¨ |
| | | -- ============================================================ |
| | | ALTER TABLE `orders` ADD COLUMN `INVOICE_STATUS` int DEFAULT NULL COMMENT 'åç¥¨ç¶æï¼0=ä¸å¯ç³è¯·ï¼1=å¯ç³è¯·ï¼2=ç³è¯·ä¸ï¼3=å¼å
·æåï¼99=å¼å
·å¤±è´¥' AFTER `MANUAL_REFUND`; |
| | | |
| | | CREATE TABLE `invoice_record` ( |
| | | `ID` int NOT NULL AUTO_INCREMENT COMMENT '主é®', |
| | | `DELETED` tinyint DEFAULT NULL COMMENT 'æ¯å¦å·²å é¤ 0æªå é¤ 1å·²å é¤', |
| | | `CREATE_USER` int DEFAULT NULL COMMENT 'å建人ç¼ç ', |
| | | `CREATE_TIME` datetime DEFAULT NULL COMMENT 'å建æ¶é´', |
| | | `UPDATE_USER` int DEFAULT NULL COMMENT 'æ´æ°äººç¼ç ', |
| | | `UPDATE_TIME` datetime DEFAULT NULL COMMENT 'æ´æ°æ¶é´', |
| | | `REMARK` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '夿³¨', |
| | | `ORDER_ID` int DEFAULT NULL COMMENT '订å主é®ï¼å
³èordersï¼', |
| | | `MEMBER_ID` int DEFAULT NULL COMMENT 'ä¼å主é®', |
| | | `ORDER_NO` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '订åç¼å·', |
| | | `INVOICE_NO` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'å票å·ç ', |
| | | `ORG_TYPE` int DEFAULT NULL COMMENT 'ç»ç»ç±»åï¼0=个人/äºä¸åä½ï¼1=ä¼ä¸', |
| | | `INVOICE_TYPE` int DEFAULT NULL COMMENT 'å票类åï¼0=çµåæ®éå票ï¼1=çµåä¸ç¨å票', |
| | | `NAME` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'å票æ¬å¤´', |
| | | `TAX_ID` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'ç¨å·', |
| | | `BANK_NAME` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '弿·é¶è¡', |
| | | `BANK_ACCOUNT` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'é¶è¡è´¦å·', |
| | | `COMPANY_ADDR` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'ä¼ä¸å°å(ORG_TYPE=1)', |
| | | `COMPANY_PHONE` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'ä¼ä¸çµè¯(ORG_TYPE=1)', |
| | | `INVOICE_AMOUNT` bigint DEFAULT NULL COMMENT 'å票éé¢', |
| | | `STATUS` int DEFAULT NULL COMMENT 'ç³è¯·ç¶æï¼0=ç³è¯·ä¸ï¼1=å¼å
·æåï¼99=å¼å
·å¤±è´¥', |
| | | `FILE_ADDR` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'å票æä»¶å°å', |
| | | PRIMARY KEY (`ID`) USING BTREE |
| | | ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='å票ç³è¯·è®°å½'; |
| | | |
| | | -- ============================================================ |
| | | -- 2026/05/15 叿ºå¥å±è§åé
ç½® |
| | | -- ============================================================ |
| | | INSERT INTO `SYSTEM_DICT_DATA` (`DICT_ID`, `CODE`, `LABEL`, `REMARK`, `SORT`, `DISABLED`, `CREATE_USER`, `CREATE_TIME`, `DELETED`) VALUES (105, '', 'REGISTER_REWARD_ORDER_COUNT', '注åå®æè®¢åå¥å±åæ°', 0, 0, 1, NOW(), 0); |
| | | INSERT INTO `SYSTEM_DICT_DATA` (`DICT_ID`, `CODE`, `LABEL`, `REMARK`, `SORT`, `DISABLED`, `CREATE_USER`, `CREATE_TIME`, `DELETED`) VALUES (105, '', 'REGISTER_REWARD_AMOUNT', '注åå®æè®¢åå¥å±éé¢ï¼åï¼', 0, 0, 1, NOW(), 0); |
| | | INSERT INTO `SYSTEM_DICT_DATA` (`DICT_ID`, `CODE`, `LABEL`, `REMARK`, `SORT`, `DISABLED`, `CREATE_USER`, `CREATE_TIME`, `DELETED`) VALUES (105, '', 'PLATFORM_REWARD_ORDER_COUNT', 'å¹³å°å®æè®¢åå¥å±åæ°', 0, 0, 1, NOW(), 0); |
| | | INSERT INTO `SYSTEM_DICT_DATA` (`DICT_ID`, `CODE`, `LABEL`, `REMARK`, `SORT`, `DISABLED`, `CREATE_USER`, `CREATE_TIME`, `DELETED`) VALUES (105, '', 'PLATFORM_REWARD_AMOUNT', 'å¹³å°å®æè®¢åå¥å±éé¢ï¼åï¼', 0, 0, 1, NOW(), 0); |
| | | |
| | | -- ============================================================ |
| | | -- 2026/05/15 é¨åºè¡¨å¢å ä½ç½®æ ç¾å段 |
| | | -- ============================================================ |
| | | ALTER TABLE `shop_info` ADD COLUMN `LOCATION_TAG_IDS` VARCHAR(500) NULL DEFAULT NULL COMMENT 'ä½ç½®æ ç¾ä¸»é®ï¼å
³ècategory type=5ï¼å¤ä¸ªä»¥éå·åå²ï¼' AFTER `DEPOSIT_TYPES`; |
| | | |
| | | -- ============================================================ |
| | | -- 2026/05/15 鿬¾è¡¨å¢å æ£è´¹ä¿¡æ¯å段 |
| | | -- ============================================================ |
| | | ALTER TABLE `orders_refund` ADD COLUMN `DEDUCT_INFO` VARCHAR(512) NULL DEFAULT NULL COMMENT 'æ£è´¹ä¿¡æ¯(JSON)ï¼åä»¶ç¹/åä»¶ç¹/叿ºæ£è´¹æç»' AFTER `BEFORE_STATUS`; |
| | | |
| | | -- ============================================================ |
| | | -- 2026/05/15 订å表å¢å æ¯å¦æå¨éæ¬¾åæ®µ |
| | | -- ============================================================ |
| | | ALTER TABLE `orders` ADD COLUMN `MANUAL_REFUND` INT DEFAULT 0 COMMENT 'æ¯å¦æå¨é款ï¼0=å¦ï¼1=æ¯' AFTER `DEDUCTION_AMOUNT`; |
| | | |
| | | |
| | | -- ============================================================ |
| | | -- 2026/05/14 订å表å¢å 伿 å¸å段 |
| | | -- ============================================================ |
| | | ALTER TABLE `orders` ADD COLUMN `COUPON_ID` INT DEFAULT NULL COMMENT '伿 å¸ä¸»é®' AFTER `OUT_TRADE_NO`; |
| | | ALTER TABLE `orders` ADD COLUMN `DEDUCTION_AMOUNT` BIGINT DEFAULT NULL COMMENT 'æµæ£éé¢ï¼åï¼' AFTER `COUPON_ID`; |
| | | |
| | | -- ============================================================ |
| | | -- 2026/05/14 ä¼å表å¢å é®ç®±å段 |
| | | -- ============================================================ |
| | | ALTER TABLE `member` ADD COLUMN `EMAIL` VARCHAR(128) DEFAULT NULL COMMENT 'é®ç®±' AFTER `NAME`; |
| | | |
| | | -- ============================================================ |
| | | -- 2026/05/13 æ³¨åæ»¡å¹´èµ é伿 å¸å®æ¶ä»»å¡ |
| | |
| | | import com.doumee.dao.system.model.SystemDictData; |
| | | import org.apache.commons.lang3.StringUtils; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | |
| | | import java.math.BigDecimal; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | |
| | |
| | | dto.setRegisterCouponGiftCount(getValue(Constants.OP_REGISTER_COUPON_GIFT_COUNT)); |
| | | dto.setRegisterCouponId(getValue(Constants.OP_REGISTER_COUPON_ID)); |
| | | dto.setRegisterGiftCouponIds(getValue(Constants.OP_REGISTER_GIFT_COUPON_IDS)); |
| | | dto.setRegisterRewardOrderCount(getValue(Constants.OP_REGISTER_REWARD_ORDER_COUNT)); |
| | | dto.setRegisterRewardAmount(fenToYuan(getValue(Constants.OP_REGISTER_REWARD_AMOUNT))); |
| | | dto.setPlatformRewardOrderCount(getValue(Constants.OP_PLATFORM_REWARD_ORDER_COUNT)); |
| | | dto.setPlatformRewardAmount(fenToYuan(getValue(Constants.OP_PLATFORM_REWARD_AMOUNT))); |
| | | dto.setInvoiceMonthLimit(getValue(Constants.OP_INVOICE_MONTH_LIMIT)); |
| | | return dto; |
| | | } |
| | | |
| | |
| | | saveOrUpdate(Constants.OP_REGISTER_COUPON_GIFT_COUNT, "注åèµ é-è³å¤èµ 鿬¡æ°", dto.getRegisterCouponGiftCount()); |
| | | saveOrUpdate(Constants.OP_REGISTER_COUPON_ID, "注åèµ é-伿 å¸ID", dto.getRegisterCouponId()); |
| | | saveOrUpdate(Constants.OP_REGISTER_GIFT_COUPON_IDS, "æ°æ³¨åèµ é-伿 å¸IDs", dto.getRegisterGiftCouponIds()); |
| | | saveOrUpdate(Constants.OP_REGISTER_REWARD_ORDER_COUNT, "注åå®æè®¢åå¥å±åæ°", dto.getRegisterRewardOrderCount()); |
| | | saveOrUpdate(Constants.OP_REGISTER_REWARD_AMOUNT, "注åå®æè®¢åå¥å±éé¢ï¼åï¼", yuanToFen(dto.getRegisterRewardAmount())); |
| | | saveOrUpdate(Constants.OP_PLATFORM_REWARD_ORDER_COUNT, "å¹³å°å®æè®¢åå¥å±åæ°", dto.getPlatformRewardOrderCount()); |
| | | saveOrUpdate(Constants.OP_PLATFORM_REWARD_AMOUNT, "å¹³å°å®æè®¢åå¥å±éé¢ï¼åï¼", yuanToFen(dto.getPlatformRewardAmount())); |
| | | saveOrUpdate(Constants.OP_INVOICE_MONTH_LIMIT, "å票å¼å
·æä»½éå¶ï¼æï¼", dto.getInvoiceMonthLimit()); |
| | | } |
| | | |
| | | private String getValue(String label) { |
| | |
| | | } |
| | | } |
| | | |
| | | private String fenToYuan(String fen) { |
| | | if (StringUtils.isBlank(fen)) { |
| | | return null; |
| | | } |
| | | return new BigDecimal(fen).divide(new BigDecimal("100"), 2, BigDecimal.ROUND_HALF_UP).toPlainString(); |
| | | } |
| | | |
| | | private String yuanToFen(String yuan) { |
| | | if (StringUtils.isBlank(yuan)) { |
| | | return null; |
| | | } |
| | | return new BigDecimal(yuan).multiply(new BigDecimal("100")).setScale(0, BigDecimal.ROUND_HALF_UP).toPlainString(); |
| | | } |
| | | |
| | | private void validate(OperationConfigDTO dto) { |
| | | if (dto == null |
| | | || StringUtils.isBlank(dto.getDriverDailyCancelLimit()) |
| | |
| | | public static final String OP_REGISTER_COUPON_GIFT_COUNT = "REGISTER_COUPON_GIFT_COUNT"; |
| | | public static final String OP_REGISTER_COUPON_ID = "REGISTER_COUPON_ID"; |
| | | public static final String OP_REGISTER_GIFT_COUPON_IDS = "REGISTER_GIFT_COUPON_IDS"; |
| | | public static final String OP_REGISTER_REWARD_ORDER_COUNT = "REGISTER_REWARD_ORDER_COUNT"; |
| | | public static final String OP_REGISTER_REWARD_AMOUNT = "REGISTER_REWARD_AMOUNT"; |
| | | public static final String OP_PLATFORM_REWARD_ORDER_COUNT = "PLATFORM_REWARD_ORDER_COUNT"; |
| | | public static final String OP_PLATFORM_REWARD_AMOUNT = "PLATFORM_REWARD_AMOUNT"; |
| | | public static final String OP_INVOICE_MONTH_LIMIT = "INVOICE_MONTH_LIMIT"; |
| | | |
| | | // è¯ç¨äºæå°æºé
ç½® |
| | | public static final String XPYUN_CONFIG = "XPYUN_CONFIG"; |
| | |
| | | EVALUATED("evaluated", "订åå·²è¯ä»·", "è¡æè®¢åï¼{orderNo}ç¨æ·å·²å®æè¯ä»·ï¼å¯åå¾è®¢åæ¥çè¯ä»·å
容"), |
| | | REFUNDING("refunding", "订å鿬¾ä¸", "è¡æè®¢åï¼{orderNo}ç¨æ·å·²æäº¤é款ç³è¯·ï¼è¯¥è®¢åä»»å¡å·²åæ¶ï¼è¯·å¿åå¾ã"), |
| | | SETTLED("settled", "订åå·²ç»ç®", "è¡æè®¢åï¼{orderNo}å¹³å°å·²å®æç»ç®ï¼éé¢ä¸º{amount}å
ï¼è¯·æ³¨ææ¥æ¶ã"), |
| | | CANCELLED("cancelled", "订ååæ¶æå", "è¡æè®¢åï¼{orderNo}已帮æ¨åæ¶ï¼æ¨ä»æ¥è¿å¯ä¸»å¨åæ¶{cancelLimit}次订åï¼è¯·åç宿æ¥åã") |
| | | CANCELLED("cancelled", "订ååæ¶æå", "è¡æè®¢åï¼{orderNo}已帮æ¨åæ¶ï¼æ¨ä»æ¥è¿å¯ä¸»å¨åæ¶{cancelLimit}次订åï¼è¯·åç宿æ¥åã"), |
| | | REWARD_UNLOCKED("rewardUnlocked", "å¹³å°å¥å±å·²è§£é", "å°æ¬ç叿ºï¼æ¨çå¹³å°å¥å±å·²è§£éï¼å®ææ´å¤è®¢åå¥å±æ´ä¸°çï¼ç¹å»åå¾ãå¥å±å¤§å
ãæ¥çå§ï¼"), |
| | | ; |
| | | |
| | | private final String key; |
| | |
| | | SHOP_AUTH_APPROVED_DEPOSIT("SMS_506135030", "é¨åºç«¯-å®¡æ ¸éè¿é缴纳æ¼é", "æåæ¨ï¼æ¨çé¨åº\"{storeName}\"å·²éè¿åæ¥å®¡æ ¸ã请æ¯ä»æ¼é{money}å
以宿å
¥é©»ï¼æ¯ä»åå³å¯ç»å½é¨åºåå°æ£å¼æ¥åã", true), |
| | | SHOP_AUTH_SUCCESS("SMS_505885083", "é¨åºç«¯-æåå
¥é©»éç¥", "æåæ¨ï¼æ¨çé¨åº\"{storeName}\"å·²éè¿å¹³å°å®¡æ ¸ï¼æ£å¼å
¥é©»æåã æ¨å¯ç»å½åå®¶åå°å¼å§æ¥åï¼è´¦å·ï¼æ³¨åææºå·ï¼åå§å¯ç ï¼ï¼{password}ï¼å»ºè®®é¦æ¬¡ç»å½åä¿®æ¹ï¼ã", true), |
| | | MEMBER_TIME_OUT("SMS_506190182", "ä¼å端-å³å°è¶
æ¶", "æ¨çè¡æè®¢åï¼{orderNo}å³å°å°è¾¾é¢è®¡åä»¶æ¶é´ï¼è¯·å°½å¿«åä»¶ï¼è¶
æ¶å°äº§çé¾æè´¹ç¨ï¼è¯·ç¥æã", true), |
| | | EXCEPTION_DISPATCH("SMS_506110517", "叿ºç«¯-å¼å¸¸æ´¾å", "æ¨æå¼å¸¸æ´¾åéå¤çï¼è®¢åå·{orderNo}ï¼è¯·å°è¡æéè³æ°å¯åç¹ï¼{address}ï¼ï¼åä»¶ç {code}ãéè¾¾å交ç±é¨åºæ ¸éªï¼å®æè½¬è¿ä»»å¡ã",true), |
| | | MEMBER_EXCEPTION_DISPATCH("SMS_506115543", "ä¼å端-å¼å¸¸æ´¾å", "å°æ¬ç客æ·ï¼å 夿¬¡èç³»ä¸ä¸æ¨ï¼ä¸ºç¡®ä¿è¡æå®å
¨ï¼å·²å°å
¶è½¬è¿è³æ°å¯åç¹ï¼{address}ã请尽快åå¾åä»¶ï¼ç¸å
³è´¹ç¨å°ç±æ¨æ¿æ
ã妿çé®è¯·è系客æï¼æè°¢æ¨ççè§£ä¸æ¯æï¼",true), |
| | | ; |
| | | |
| | | private final String templateCode; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.doumee.dao.business; |
| | | |
| | | import com.doumee.dao.business.model.InvoiceRecord; |
| | | import com.github.yulichang.base.MPJBaseMapper; |
| | | |
| | | /** |
| | | * å票ç³è¯·è®°å½Mapper |
| | | * |
| | | * @author rk |
| | | * @date 2026/05/18 |
| | | */ |
| | | public interface InvoiceRecordMapper extends MPJBaseMapper<InvoiceRecord> { |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.doumee.dao.business; |
| | | |
| | | import com.doumee.dao.business.model.RewardRecord; |
| | | import com.github.yulichang.base.MPJBaseMapper; |
| | | |
| | | /** |
| | | * å¥å±è®°å½Mapper |
| | | * |
| | | * @author rk |
| | | * @date 2026/05/15 |
| | | */ |
| | | public interface RewardRecordMapper extends MPJBaseMapper<RewardRecord> { |
| | | |
| | | } |
| | |
| | | @ExcelColumn(name="åä½åç§°") |
| | | private String name; |
| | | |
| | | @ApiModelProperty(value = "ç±»å:1=车è¾ç±»å;2=ç©ååç±»;3=ç©åç级;4=ç©å尺寸;", example = "1") |
| | | @ExcelColumn(name="ç±»å:1=车è¾ç±»å;2=ç©ååç±»;3=ç©åç级;4=ç©å尺寸;") |
| | | @ApiModelProperty(value = "ç±»å:1=车è¾ç±»å;2=ç©ååç±»;3=ç©åç级;4=ç©å尺寸;5=ä½ç½®æ ç¾;", example = "1") |
| | | @ExcelColumn(name="ç±»å:1=车è¾ç±»å;2=ç©ååç±»;3=ç©åç级;4=ç©å尺寸;5=ä½ç½®æ ç¾;") |
| | | private Integer type; |
| | | |
| | | @ApiModelProperty(value = "å
容 ï¼type=1ï¼éè¡æ¹å¼ æºå¨è½¦ = driving éæºå¨è½¦ = bicycling ; type=2=å¯å说æ ï¼ type=3ï¼å¸æºè¯çº§ï¼type=4:æ¯å¦ç¹å¤§å°ºå¯¸ 0=å¦ï¼1=æ¯ï¼ï¼;") |
| | |
| | | @ExcelColumn(name = "ææºå·", index = 3, width = 12) |
| | | private String telephone; |
| | | |
| | | @ApiModelProperty(value = "æ§å«ï¼1=ç·ï¼2=女", example = "1") |
| | | @ApiModelProperty(value = "æ§å«ï¼1=ç·;2=女;", example = "1") |
| | | @TableField(exist = false) |
| | | @ExcelColumn(name = "æ§å«", index = 2, width = 6, valueMapping = "1=ç·ï¼2=女") |
| | | @ExcelColumn(name = "æ§å«", index = 2, width = 6, valueMapping = "1=ç·;2=女") |
| | | private Integer gender; |
| | | |
| | | @ApiModelProperty(value = "身份è¯å·ç ") |
| | |
| | | private Date cardEndDate; |
| | | |
| | | @ApiModelProperty(value = "叿ºç¶æï¼0=å¯ç¨ï¼1=ç¦ç¨ï¼", example = "0") |
| | | @ExcelColumn(name = "ç¶æ", index = 8, width = 8, valueMapping = "0=å¯ç¨ï¼1=ç¦ç¨ï¼") |
| | | @ExcelColumn(name = "ç¶æ", index = 8, width = 8, valueMapping = "0=å¯ç¨;1=ç¦ç¨;") |
| | | private Integer status; |
| | | |
| | | @ApiModelProperty(value = "审æ¹ç¶æï¼0=å¾
审æ¹ï¼1=审æ¹éè¿ï¼2=审æ¹é©³åï¼3=å·²æ¯ä»æ¼éï¼99=æªè®¤è¯ï¼", example = "0") |
| | | @ExcelColumn(name = "审æ¹ç¶æ", index = 9, width = 10, valueMapping = "审æ¹ç¶æï¼0=å¾
审æ¹ï¼1=审æ¹éè¿ï¼2=审æ¹é©³åï¼3=å·²æ¯ä»æ¼éï¼99=æªè®¤è¯ï¼") |
| | | @ExcelColumn(name = "审æ¹ç¶æ", index = 9, width = 10, valueMapping = "0=å¾
审æ¹;1=审æ¹éè¿;2=审æ¹é©³å;3=å·²æ¯ä»æ¼é;99=æªè®¤è¯;") |
| | | private Integer auditStatus; |
| | | |
| | | @ApiModelProperty(value = "OPENID(APP)") |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.doumee.dao.business.model; |
| | | |
| | | import com.baomidou.mybatisplus.annotation.IdType; |
| | | import com.baomidou.mybatisplus.annotation.TableField; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import com.fasterxml.jackson.annotation.JsonFormat; |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | import java.util.Date; |
| | | |
| | | /** |
| | | * å票ç³è¯·è®°å½ |
| | | * |
| | | * @author rk |
| | | * @date 2026/05/18 |
| | | */ |
| | | @Data |
| | | @ApiModel("å票ç³è¯·è®°å½") |
| | | @TableName("`invoice_record`") |
| | | public class InvoiceRecord { |
| | | |
| | | @TableId(type = IdType.AUTO) |
| | | @ApiModelProperty(value = "主é®", example = "1") |
| | | private Integer id; |
| | | |
| | | @ApiModelProperty(value = "æ¯å¦å·²å é¤ 0æªå é¤ 1å·²å é¤", example = "0") |
| | | private Integer deleted; |
| | | |
| | | @ApiModelProperty(value = "å建人ç¼ç ", example = "1") |
| | | private Integer createUser; |
| | | |
| | | @ApiModelProperty(value = "å建æ¶é´") |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | private Date createTime; |
| | | |
| | | @ApiModelProperty(value = "æ´æ°äººç¼ç ", example = "1") |
| | | private Integer updateUser; |
| | | |
| | | @ApiModelProperty(value = "æ´æ°æ¶é´") |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | private Date updateTime; |
| | | |
| | | @ApiModelProperty(value = "夿³¨") |
| | | private String remark; |
| | | |
| | | @ApiModelProperty(value = "订å主é®") |
| | | private Integer orderId; |
| | | |
| | | @ApiModelProperty(value = "ä¼å主é®") |
| | | private Integer memberId; |
| | | |
| | | @ApiModelProperty(value = "订åç¼å·") |
| | | private String orderNo; |
| | | |
| | | @ApiModelProperty(value = "å票å·ç ") |
| | | private String invoiceNo; |
| | | |
| | | @ApiModelProperty(value = "ç»ç»ç±»åï¼0=个人/äºä¸åä½ï¼1=ä¼ä¸") |
| | | private Integer orgType; |
| | | |
| | | @ApiModelProperty(value = "å票类åï¼0=çµåæ®éå票ï¼1=çµåä¸ç¨å票") |
| | | private Integer invoiceType; |
| | | |
| | | @ApiModelProperty(value = "å票æ¬å¤´") |
| | | private String name; |
| | | |
| | | @ApiModelProperty(value = "ç¨å·") |
| | | private String taxId; |
| | | |
| | | @ApiModelProperty(value = "弿·é¶è¡") |
| | | private String bankName; |
| | | |
| | | @ApiModelProperty(value = "é¶è¡è´¦å·") |
| | | private String bankAccount; |
| | | |
| | | @ApiModelProperty(value = "ä¼ä¸å°åï¼ORG_TYPE=1ï¼") |
| | | private String companyAddr; |
| | | |
| | | @ApiModelProperty(value = "ä¼ä¸çµè¯ï¼ORG_TYPE=1ï¼") |
| | | private String companyPhone; |
| | | |
| | | @ApiModelProperty(value = "å票éé¢ï¼åï¼") |
| | | private Long invoiceAmount; |
| | | |
| | | @ApiModelProperty(value = "ç³è¯·ç¶æï¼0=ç³è¯·ä¸ï¼1=å¼å
·æåï¼99=å¼å
·å¤±è´¥") |
| | | private Integer status; |
| | | |
| | | @ApiModelProperty(value = "å票æä»¶å°å") |
| | | private String fileAddr; |
| | | |
| | | @ApiModelProperty(value = "å¼ç¥¨é®ç®±") |
| | | private String email; |
| | | |
| | | @ApiModelProperty(value = "å票PDFæä»¶KEY") |
| | | private String invoicePdfKey; |
| | | |
| | | @TableField(exist = false) |
| | | @ApiModelProperty(value = "ç³è¯·å¼å§æ¥æ") |
| | | @JsonFormat(pattern = "yyyy-MM-dd") |
| | | private Date startDate; |
| | | |
| | | @TableField(exist = false) |
| | | @ApiModelProperty(value = "ç³è¯·ç»ææ¥æ") |
| | | @JsonFormat(pattern = "yyyy-MM-dd") |
| | | private Date endDate; |
| | | } |
| | |
| | | @ExcelColumn(name="çå®å§å",index = 4,width = 10) |
| | | private String name; |
| | | |
| | | @ApiModelProperty(value = "é®ç®±") |
| | | private String email; |
| | | |
| | | @ApiModelProperty(value = "å½åä½é¢(åä½:å)", example = "1") |
| | | private Long amount; |
| | | |
| | |
| | | @ApiModelProperty(value = "对象ç¼ç ", example = "1") |
| | | private Integer objId; |
| | | |
| | | @ApiModelProperty(value = "对象类åï¼0=订åç±»åï¼99=å
¶ä»ç±»å", example = "0") |
| | | @ApiModelProperty(value = "对象类åï¼0=订åï¼2=å¥å±å¤§å
ï¼99=å
¶ä»", example = "0") |
| | | private Integer objType; |
| | | |
| | | @ApiModelProperty(value = "ç¶æï¼0=æªè¯»ï¼1=已读", example = "0") |
| | |
| | | @ExcelColumn(name = "é¢ä¼°è´¹ç¨") |
| | | private Long estimatedAmount; |
| | | |
| | | @ApiModelProperty(value = "åºç¡è´¹ç¨/åä»·ï¼åï¼") |
| | | @ApiModelProperty(value = "åºç¡è´¹ç¨-åä»·ï¼åï¼") |
| | | @ExcelColumn(name = "åºç¡è´¹ç¨") |
| | | private Long price; |
| | | |
| | |
| | | @ExcelColumn(name = "åºç¡å¯åè´¹ç¨") |
| | | private Long basicAmount; |
| | | |
| | | @ApiModelProperty(value = "è®¢åæ»è´¹ç¨ï¼åï¼") |
| | | @ApiModelProperty(value = "è®¢åæ»è´¹ç¨ï¼åï¼",notes = "计å
¥é¾æè´¹ç¨ä¸ä¼æ å¸è´¹ç¨") |
| | | @ExcelColumn(name = "è®¢åæ»è´¹ç¨") |
| | | private Long totalAmount; |
| | | |
| | |
| | | @ApiModelProperty(value = "䏿¹è®¢åå·") |
| | | private String outTradeNo; |
| | | |
| | | @ApiModelProperty(value = "伿 å¸ä¸»é®") |
| | | private Integer couponId; |
| | | |
| | | @ApiModelProperty(value = "伿 叿µæ£éé¢ï¼åï¼") |
| | | private Long deductionAmount; |
| | | |
| | | @ApiModelProperty(value = "æ¯å¦æå¨é款ï¼0=å¦ï¼1=æ¯", example = "0") |
| | | private Integer manualRefund; |
| | | |
| | | @ApiModelProperty(value = "åç¥¨ç¶æï¼0=ä¸å¯ç³è¯·ï¼1=å¯ç³è¯·ï¼2=ç³è¯·ä¸ï¼3=å¼å
·æåï¼99=å¼å
·å¤±è´¥", example = "0") |
| | | private Integer invoiceStatus; |
| | | |
| | | @ApiModelProperty(value = "é¨åºå¼å¸¸è¡¥å¿éé¢ï¼åï¼") |
| | | private Long shopCompensationAmount; |
| | | |
| | | @ApiModelProperty(value = "æ 人æ¥åæ¯å¦å·²çä¿¡éç¥å¹³å°ï¼0=å¦ï¼1=æ¯", example = "0") |
| | | private Integer platformSmsNotified; |
| | | |
| | |
| | | @ApiModelProperty(value = "订å主é®", example = "1") |
| | | private Integer orderId; |
| | | |
| | | @ApiModelProperty(value = "鿬¾æ¹å¼ï¼0=æªåä»¶ç´æ¥åæ¶ï¼1=å¹³å°ç´æ¥åæ¶ï¼2=å·²åä»¶ç³è¯·åæ¶ï¼3=订å宿鿬¾", example = "0") |
| | | @ApiModelProperty(value = "鿬¾æ¹å¼ï¼0=æªåä»¶ç´æ¥åæ¶ï¼1=å¹³å°ç´æ¥åæ¶ï¼2=å·²åä»¶ç³è¯·åæ¶ï¼3=订å宿鿬¾ï¼4=æå¨é款", example = "0") |
| | | private Integer type; |
| | | |
| | | @ApiModelProperty(value = "åæ¶åå ") |
| | |
| | | @ApiModelProperty(value = "鿬¾å订åç¶æ", example = "1") |
| | | private Integer beforeStatus; |
| | | |
| | | @ApiModelProperty(value = "æ£è´¹ä¿¡æ¯(JSON)", notes = "{\"depositShopDeduct\":100,\"takeShopDeduct\":50,\"driverDeduct\":200}ï¼æå¨é款æ¶ä½¿ç¨") |
| | | private String deductInfo; |
| | | |
| | | @TableField(exist = false) |
| | | @ApiModelProperty(value = "订åç¼å·ï¼å
³èæ¥è¯¢ï¼") |
| | | private String orderCode; |
| | |
| | | @ExcelColumn(name = "ç¶æ", valueMapping = "0=å
¥è´¦ä¸;1=å·²å
¥è´¦;", index = 6, width = 8) |
| | | private Integer vaildStatus; |
| | | |
| | | @ApiModelProperty(value = "ç±»åï¼0=å®æè®¢åï¼1=æç°æ¯åºï¼2=æç°éåï¼3=å¹³å°å¥å±", example = "0") |
| | | @ExcelColumn(name = "ä¸å¡ç±»å", valueMapping = "0=å®æè®¢å;1=æç°æ¯åº;2=æç°éå;3=å¹³å°å¥å±;", index = 4, width = 12) |
| | | @ApiModelProperty(value = "ç±»åï¼0=å®æè®¢åï¼1=æç°æ¯åºï¼2=æç°éåï¼3=å¹³å°å¥å±ï¼4=è´£ä»»æ£æ¬¾ï¼5=å¼å¸¸éé¢", example = "0") |
| | | @ExcelColumn(name = "ä¸å¡ç±»å", valueMapping = "0=å®æè®¢å;1=æç°æ¯åº;2=æç°éå;3=å¹³å°å¥å±;4=è´£ä»»æ£æ¬¾;5=å¼å¸¸éé¢;", index = 4, width = 12) |
| | | private Integer type; |
| | | |
| | | @ApiModelProperty(value = "æ¶æ¯ç±»åï¼1=æ¶å
¥ï¼-1=æ¯åº", example = "1") |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.doumee.dao.business.model; |
| | | |
| | | import com.baomidou.mybatisplus.annotation.IdType; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import com.fasterxml.jackson.annotation.JsonFormat; |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | import java.util.Date; |
| | | |
| | | /** |
| | | * å¥å±è®°å½ |
| | | * |
| | | * @author rk |
| | | * @date 2026/05/15 |
| | | */ |
| | | @Data |
| | | @ApiModel("å¥å±è®°å½") |
| | | @TableName("`reward_record`") |
| | | public class RewardRecord { |
| | | |
| | | @TableId(type = IdType.AUTO) |
| | | @ApiModelProperty(value = "主é®", example = "1") |
| | | private Integer id; |
| | | |
| | | @ApiModelProperty(value = "æ¯å¦å·²å é¤ 0æªå é¤ 1å·²å é¤", example = "0") |
| | | private Integer deleted; |
| | | |
| | | @ApiModelProperty(value = "å建人ç¼ç ", example = "1") |
| | | private Integer createUser; |
| | | |
| | | @ApiModelProperty(value = "å建æ¶é´") |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | private Date createTime; |
| | | |
| | | @ApiModelProperty(value = "æ´æ°äººç¼ç ", example = "1") |
| | | private Integer updateUser; |
| | | |
| | | @ApiModelProperty(value = "æ´æ°æ¶é´") |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | private Date updateTime; |
| | | |
| | | @ApiModelProperty(value = "夿³¨") |
| | | private String remark; |
| | | |
| | | @ApiModelProperty(value = "订å主é®") |
| | | private Integer orderId; |
| | | |
| | | @ApiModelProperty(value = "叿ºä¸»é®") |
| | | private Integer driverId; |
| | | |
| | | @ApiModelProperty(value = "ç¶æï¼0=å¾
é¢åï¼1=å·²é¢å") |
| | | private Integer status; |
| | | |
| | | @ApiModelProperty(value = "å¥å±ç±»åï¼0=注åå¥å±ï¼1=é¨åºå¥å±") |
| | | private Integer type; |
| | | |
| | | @ApiModelProperty(value = "é¢åæ¶é´") |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | private Date claimTime; |
| | | |
| | | @ApiModelProperty(value = "é¢åæ¶æ¯è®°å½ä¸»é®") |
| | | private Integer revenueId; |
| | | |
| | | @ApiModelProperty(value = "å¥å±éé¢ï¼åï¼") |
| | | private Long amount; |
| | | } |
| | |
| | | @ApiModelProperty(value = "å¯åç±»åï¼éå·åéçcategory主é®ï¼") |
| | | private String depositTypes; |
| | | |
| | | @ApiModelProperty(value = "ä½ç½®æ ç¾ä¸»é®ï¼å
³ècategory type=5ï¼å¤ä¸ªä»¥éå·åå²ï¼") |
| | | private String locationTagIds; |
| | | |
| | | @ApiModelProperty(value = "æ¶è´¹æ å") |
| | | private String feeStandard; |
| | | |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.doumee.dao.dto; |
| | | |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | import javax.validation.constraints.NotBlank; |
| | | import javax.validation.constraints.NotNull; |
| | | import java.io.Serializable; |
| | | |
| | | /** |
| | | * å¼ç¥¨ç³è¯·è¯·æ± |
| | | * |
| | | * @author rk |
| | | * @date 2026/05/18 |
| | | */ |
| | | @Data |
| | | @ApiModel("å¼ç¥¨ç³è¯·è¯·æ±") |
| | | public class ApplyInvoiceDTO implements Serializable { |
| | | |
| | | @NotNull(message = "订å主é®ä¸è½ä¸ºç©º") |
| | | @ApiModelProperty(value = "订å主é®", required = true) |
| | | private Integer orderId; |
| | | |
| | | @NotNull(message = "ç»ç»ç±»åä¸è½ä¸ºç©º") |
| | | @ApiModelProperty(value = "ç»ç»ç±»åï¼0=个人/äºä¸åä½ï¼1=ä¼ä¸", required = true) |
| | | private Integer orgType; |
| | | |
| | | @NotNull(message = "å票类åä¸è½ä¸ºç©º") |
| | | @ApiModelProperty(value = "å票类åï¼0=çµåæ®éå票ï¼1=çµåä¸ç¨å票", required = true) |
| | | private Integer invoiceType; |
| | | |
| | | @NotBlank(message = "å票æ¬å¤´ä¸è½ä¸ºç©º") |
| | | @ApiModelProperty(value = "å票æ¬å¤´", required = true) |
| | | private String name; |
| | | |
| | | @ApiModelProperty(value = "ç¨å·ï¼ä¼ä¸å¿
å¡«ï¼") |
| | | private String taxId; |
| | | |
| | | @ApiModelProperty(value = "弿·é¶è¡ï¼ä¸ç¨å票å¿
å¡«ï¼") |
| | | private String bankName; |
| | | |
| | | @ApiModelProperty(value = "é¶è¡è´¦å·ï¼ä¸ç¨å票å¿
å¡«ï¼") |
| | | private String bankAccount; |
| | | |
| | | @ApiModelProperty(value = "ä¼ä¸å°åï¼ä¸ç¨å票å¿
å¡«ï¼") |
| | | private String companyAddr; |
| | | |
| | | @ApiModelProperty(value = "ä¼ä¸çµè¯ï¼ä¸ç¨å票å¿
å¡«ï¼") |
| | | private String companyPhone; |
| | | } |
| | |
| | | package com.doumee.dao.dto; |
| | | |
| | | import io.swagger.annotations.ApiModel; |
| | | import java.math.BigDecimal; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | |
| | | @ApiModelProperty(value = "叿ºå®çº§ï¼5=Sï¼4=Aï¼3=Bï¼2=Cï¼1=Dï¼å®¡æ¹éè¿æ¶å¿
å¡«ï¼", example = "5") |
| | | private Integer driverLevel; |
| | | |
| | | @ApiModelProperty(value = "å°±å°å¯åæ¶çæ¯ä¾ï¼å®¡æ¹éè¿æ¶å¿
å¡«ï¼", example = "5") |
| | | private BigDecimal localDeposit; |
| | | |
| | | @ApiModelProperty(value = "å¼å°å¯åæ¶çæ¯ä¾ï¼å®¡æ¹éè¿æ¶å¿
å¡«ï¼", example = "5") |
| | | private BigDecimal remoteDeposit; |
| | | |
| | | @ApiModelProperty(value = "å¼å°åä»¶æ¶çæ¯ä¾ï¼å®¡æ¹éè¿æ¶å¿
å¡«ï¼", example = "5") |
| | | private BigDecimal remoteTake; |
| | | |
| | | @ApiModelProperty(value = "审æ¹äººç¼ç ï¼æå¡ç«¯å¡«å
ï¼", hidden = true) |
| | | private Integer auditUser; |
| | | |
| | |
| | | |
| | | @ApiModelProperty(value = "ä¿ä»·éé¢(å
)") |
| | | private BigDecimal declaredAmount; |
| | | |
| | | @ApiModelProperty(value = "ä¼å主é®", hidden = true) |
| | | private Integer memberId; |
| | | |
| | | @ApiModelProperty(value = "伿 å¸ä¸»é®ï¼-1=èªå¨éæ©æä¼ï¼null=ä¸ä½¿ç¨ï¼>0=æå®ä¼æ å¸ID") |
| | | private Integer couponId; |
| | | } |
| | |
| | | |
| | | @ApiModelProperty(value = "æ¯å¦å æ¥") |
| | | private Boolean urgent; |
| | | |
| | | @ApiModelProperty(value = "ä¼å主é®", hidden = true) |
| | | private Integer memberId; |
| | | |
| | | @ApiModelProperty(value = "伿 å¸ä¸»é®ï¼-1=èªå¨éæ©æä¼ï¼null=ä¸ä½¿ç¨ï¼>0=æå®ä¼æ å¸ID") |
| | | private Integer couponId; |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.doumee.dao.dto; |
| | | |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | import javax.validation.constraints.NotNull; |
| | | import java.io.Serializable; |
| | | |
| | | /** |
| | | * é¢åå¥å±éè¯·æ± |
| | | * |
| | | * @Author : Rk |
| | | * @create 2026/05/15 |
| | | */ |
| | | @Data |
| | | @ApiModel("é¢åå¥å±é请æ±") |
| | | public class ClaimRewardDTO implements Serializable { |
| | | |
| | | @NotNull(message = "å¥å±è®°å½IDä¸è½ä¸ºç©º") |
| | | @ApiModelProperty(value = "å¥å±è®°å½ID", required = true) |
| | | private Integer rewardRecordId; |
| | | } |
| | |
| | | |
| | | @ApiModelProperty(value = "订å夿³¨(éå¿
å¡«)") |
| | | private String remark; |
| | | |
| | | @ApiModelProperty(value = "伿 å¸ä¸»é®ï¼å¯éï¼") |
| | | private Integer couponId; |
| | | } |
| | |
| | | package com.doumee.dao.dto; |
| | | |
| | | import com.fasterxml.jackson.annotation.JsonFormat; |
| | | import com.fasterxml.jackson.annotation.JsonIgnore; |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | import java.io.Serializable; |
| | | import java.util.Calendar; |
| | | import java.util.Date; |
| | | |
| | | @Data |
| | | @ApiModel("æ°æ®çæ¿æ¥è¯¢æ¡ä»¶") |
| | | public class DataBoardQueryDTO implements Serializable { |
| | | |
| | | @ApiModelProperty(value = "å¼å§æ¶é´") |
| | | @ApiModelProperty(value = "æ¥ææ®µç±»åï¼0=仿¥ï¼1=è¿ä¸å¤©ï¼2=è¿30天ï¼3=è¿åå¹´ï¼4=è¿ä¸å¹´", required = true) |
| | | private Integer dateType; |
| | | |
| | | @JsonIgnore |
| | | @JsonFormat(pattern = "yyyy-MM-dd") |
| | | private Date startDate; |
| | | |
| | | @ApiModelProperty(value = "ç»ææ¶é´") |
| | | @JsonIgnore |
| | | @JsonFormat(pattern = "yyyy-MM-dd") |
| | | private Date endDate; |
| | | |
| | | @ApiModelProperty(value = "é¨åºä¸»é®ï¼å¯éï¼") |
| | | private Integer shopId; |
| | | |
| | | public void resolveDateRange() { |
| | | Calendar now = Calendar.getInstance(); |
| | | now.set(Calendar.MINUTE, 0); |
| | | now.set(Calendar.SECOND, 0); |
| | | now.set(Calendar.MILLISECOND, 0); |
| | | now.set(Calendar.HOUR_OF_DAY, 0); |
| | | |
| | | Calendar start = Calendar.getInstance(); |
| | | start.set(Calendar.MINUTE, 0); |
| | | start.set(Calendar.SECOND, 0); |
| | | start.set(Calendar.MILLISECOND, 0); |
| | | start.set(Calendar.HOUR_OF_DAY, 0); |
| | | |
| | | switch (dateType != null ? dateType : 0) { |
| | | case 1: |
| | | start.add(Calendar.DAY_OF_MONTH, -6); |
| | | break; |
| | | case 2: |
| | | start.add(Calendar.DAY_OF_MONTH, -29); |
| | | break; |
| | | case 3: |
| | | start.add(Calendar.MONTH, -6); |
| | | break; |
| | | case 4: |
| | | start.add(Calendar.YEAR, -1); |
| | | break; |
| | | default: |
| | | // 0=仿¥ï¼start å·²ç»æ¯ä»å¤© |
| | | break; |
| | | } |
| | | this.startDate = start.getTime(); |
| | | |
| | | Calendar end = Calendar.getInstance(); |
| | | end.set(Calendar.HOUR_OF_DAY, 23); |
| | | end.set(Calendar.MINUTE, 59); |
| | | end.set(Calendar.SECOND, 59); |
| | | end.set(Calendar.MILLISECOND, 999); |
| | | this.endDate = end.getTime(); |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.doumee.dao.dto; |
| | | |
| | | import com.fasterxml.jackson.annotation.JsonFormat; |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | import java.io.Serializable; |
| | | import java.util.Date; |
| | | |
| | | @Data |
| | | @ApiModel("å¹³å°è´¢å¡æ¥è¯¢æ¡ä»¶") |
| | | public class FinanceQueryDTO implements Serializable { |
| | | |
| | | @ApiModelProperty(value = "å¼å§å¹´æ", required = true) |
| | | @JsonFormat(pattern = "yyyy-MM") |
| | | private Date startDate; |
| | | |
| | | @ApiModelProperty(value = "ç»æå¹´æ", required = true) |
| | | @JsonFormat(pattern = "yyyy-MM") |
| | | private Date endDate; |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.doumee.dao.dto; |
| | | |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | import javax.validation.constraints.NotBlank; |
| | | import javax.validation.constraints.NotNull; |
| | | import java.io.Serializable; |
| | | |
| | | /** |
| | | * 订åå¼å¸¸å¤çè¯·æ± |
| | | * |
| | | * @author rk |
| | | * @date 2026/05/18 |
| | | */ |
| | | @Data |
| | | @ApiModel("订åå¼å¸¸å¤ç请æ±") |
| | | public class HandleOrderExceptionDTO implements Serializable { |
| | | |
| | | @NotNull(message = "订å主é®ä¸è½ä¸ºç©º") |
| | | @ApiModelProperty(value = "æä½è®¢å主é®", required = true) |
| | | private Integer orderId; |
| | | |
| | | @NotNull(message = "åæ¾é¨åºä¸»é®ä¸è½ä¸ºç©º") |
| | | @ApiModelProperty(value = "åæ¾é¨åºä¸»é®", required = true) |
| | | private Integer depositShopId; |
| | | |
| | | @NotNull(message = "å¼å¸¸è¡¥å¿å¸æºéé¢ä¸è½ä¸ºç©º") |
| | | @ApiModelProperty(value = "å¼å¸¸è¡¥å¿å¸æºéé¢ï¼åï¼", required = true) |
| | | private Long driverCompensation; |
| | | |
| | | @NotNull(message = "å¼å¸¸è¡¥å¿é¨åºéé¢ä¸è½ä¸ºç©º") |
| | | @ApiModelProperty(value = "å¼å¸¸è¡¥å¿é¨åºéé¢ï¼åï¼", required = true) |
| | | private Long shopCompensation; |
| | | |
| | | @NotBlank(message = "å¼å¸¸å¤æ³¨ä¸è½ä¸ºç©º") |
| | | @ApiModelProperty(value = "å¼å¸¸å¤æ³¨", required = true) |
| | | private String remark; |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.doumee.dao.dto; |
| | | |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | import javax.validation.constraints.NotNull; |
| | | |
| | | /** |
| | | * æå¨é款请æ±DTO |
| | | * |
| | | * @Author : Rk |
| | | * @create 2026/05/15 |
| | | */ |
| | | @Data |
| | | @ApiModel("æå¨é款请æ±") |
| | | public class ManualRefundDTO { |
| | | |
| | | @ApiModelProperty(value = "订å主é®", example = "1", required = true) |
| | | @NotNull(message = "订å主é®ä¸è½ä¸ºç©º") |
| | | private Integer orderId; |
| | | |
| | | @ApiModelProperty(value = "鿬¾éé¢ï¼åï¼", example = "10000", required = true, |
| | | notes = "å¿
须大äº0ä¸å°äºçäº(æ¯ä»éé¢-已鿬¾éé¢)") |
| | | @NotNull(message = "鿬¾éé¢ä¸è½ä¸ºç©º") |
| | | private Long refundAmount; |
| | | |
| | | @ApiModelProperty(value = "åä»¶é¨åºæ£æ¬¾éé¢ï¼åï¼", example = "500", |
| | | notes = "ææè®¢åç±»åååå¨åä»¶é¨åºï¼éå¿
å¡«ï¼ä¸å¡«å䏿£æ¬¾") |
| | | private Long depositShopDeduct; |
| | | |
| | | @ApiModelProperty(value = "åä»¶é¨åºæ£æ¬¾éé¢ï¼åï¼", example = "300", |
| | | notes = "ä»
å¼å°è®¢å(type=1)ä¸åå¨åä»¶é¨åº(takeShopId!=null)æ¶ææï¼å
¶ä»æ
åµä¼ å
¥å¿½ç¥") |
| | | private Long takeShopDeduct; |
| | | |
| | | @ApiModelProperty(value = "叿ºæ£æ¬¾éé¢ï¼åï¼", example = "200", |
| | | notes = "ä»
å¼å°è®¢å(type=1)æ¶ææï¼å
¶ä»æ
åµä¼ å
¥å¿½ç¥") |
| | | private Long driverDeduct; |
| | | |
| | | @ApiModelProperty(value = "夿³¨") |
| | | private String remark; |
| | | } |
| | |
| | | @ApiModelProperty(value = "æç´¢å
³é®è¯ï¼æ¶ä»¶äºº/æ¶ä»¶äººçµè¯æ¨¡ç³/订åå·ç²¾åï¼") |
| | | private String keyword; |
| | | |
| | | @ApiModelProperty(value = "åç¥¨ç¶æçéï¼å¯éï¼ï¼1=å¯å¼ç¥¨è®¢å", example = "1") |
| | | private Integer invoiceStatus; |
| | | |
| | | } |
| | |
| | | @ApiModelProperty(value = "æ°æ³¨åç¨æ·èµ é伿 å¸IDï¼å¤ä¸ªä»¥,åå²ï¼") |
| | | private String registerGiftCouponIds; |
| | | |
| | | @ApiModelProperty(value = "注åå®æè®¢åå¥å±åæ°") |
| | | private String registerRewardOrderCount; |
| | | |
| | | @ApiModelProperty(value = "注åå®æè®¢åå¥å±éé¢ï¼åï¼") |
| | | private String registerRewardAmount; |
| | | |
| | | @ApiModelProperty(value = "å¹³å°å®æè®¢åå¥å±åæ°") |
| | | private String platformRewardOrderCount; |
| | | |
| | | @ApiModelProperty(value = "å¹³å°å®æè®¢åå¥å±éé¢ï¼åï¼") |
| | | private String platformRewardAmount; |
| | | |
| | | @ApiModelProperty(value = "å票å¼å
·æä»½éå¶ï¼æï¼", required = true) |
| | | private String invoiceMonthLimit; |
| | | |
| | | } |
| | |
| | | @ApiModelProperty(value = "æ¶æ¯ç±»åï¼1=æ¶å
¥ï¼-1=æ¯åº") |
| | | private Integer optType; |
| | | |
| | | @ApiModelProperty(value = "åå¨ç±»åï¼0=å®æè®¢åï¼1=æç°æ¯åºï¼2=æç°éåï¼3=å¹³å°å¥å±") |
| | | @ApiModelProperty(value = "åå¨ç±»åï¼0=å®æè®¢åï¼1=æç°æ¯åºï¼2=æç°éåï¼3=å¹³å°å¥å±ï¼4=è´£ä»»æ£æ¬¾") |
| | | private Integer type; |
| | | |
| | | @JsonFormat(pattern = "yyyy-MM-dd") |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.doumee.dao.dto; |
| | | |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | import javax.validation.constraints.Email; |
| | | import javax.validation.constraints.NotBlank; |
| | | import javax.validation.constraints.NotNull; |
| | | import java.io.Serializable; |
| | | |
| | | /** |
| | | * åéå票é®ä»¶è¯·æ± |
| | | * |
| | | * @author rk |
| | | * @date 2026/05/18 |
| | | */ |
| | | @Data |
| | | @ApiModel("åéå票é®ä»¶è¯·æ±") |
| | | public class SendInvoiceEmailDTO implements Serializable { |
| | | |
| | | @NotNull(message = "å票记å½IDä¸è½ä¸ºç©º") |
| | | @ApiModelProperty(value = "å票记å½ID", required = true) |
| | | private Integer invoiceRecordId; |
| | | |
| | | @NotBlank(message = "é®ç®±ä¸è½ä¸ºç©º") |
| | | @Email(message = "é®ç®±æ ¼å¼ä¸æ£ç¡®") |
| | | @ApiModelProperty(value = "æ¥æ¶é®ç®±", required = true) |
| | | private String email; |
| | | } |
| | |
| | | @ApiModelProperty(value = "åå¸ä¸»é®", example = "1") |
| | | private Integer cityId; |
| | | |
| | | @ApiModelProperty(value = "ä½ç½®æ ç¾ä¸»é®ï¼category type=5ï¼", example = "1") |
| | | private Integer locationTagId; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.doumee.dao.dto; |
| | | |
| | | import com.fasterxml.jackson.annotation.JsonFormat; |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | import javax.validation.constraints.NotNull; |
| | | import java.io.Serializable; |
| | | import java.util.Date; |
| | | |
| | | /** |
| | | * é¨åºè¥æ¶æ¥è¯¢è¯·æ± |
| | | * |
| | | * @Author : Rk |
| | | * @create 2026/05/15 |
| | | */ |
| | | @Data |
| | | @ApiModel("é¨åºè¥æ¶æ¥è¯¢è¯·æ±") |
| | | public class ShopRevenueQueryDTO implements Serializable { |
| | | |
| | | @ApiModelProperty(value = "å¼å§æ¥æ", example = "2026-01-01") |
| | | @NotNull(message = "å¼å§æ¥æä¸è½ä¸ºç©º") |
| | | @JsonFormat(pattern = "yyyy-MM-dd") |
| | | private Date startDate; |
| | | |
| | | @ApiModelProperty(value = "ç»ææ¥æ", example = "2026-12-31") |
| | | @NotNull(message = "ç»ææ¥æä¸è½ä¸ºç©º") |
| | | @JsonFormat(pattern = "yyyy-MM-dd") |
| | | private Date endDate; |
| | | } |
| | |
| | | @NotNull(message = "å¼å°åä»¶åæå æ¯ä¸è½ä¸ºç©º") |
| | | private Double remoteTake; |
| | | |
| | | @ApiModelProperty(value = "ä½ç½®æ ç¾ä¸»é®ï¼å
³ècategory type=5ï¼å¤ä¸ªä»¥éå·åå²ï¼", required = true) |
| | | @NotBlank(message = "ä½ç½®æ ç¾ä¸è½ä¸ºç©º") |
| | | private String locationTagIds; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.doumee.dao.dto; |
| | | |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | import java.io.Serializable; |
| | | |
| | | @Data |
| | | @ApiModel("è¶å¿æ¥è¯¢æ¡ä»¶") |
| | | public class TrendQueryDTO implements Serializable { |
| | | |
| | | @ApiModelProperty(value = "æ¥è¯¢å¹´æï¼æ ¼å¼yyyy-MMï¼æææ¥è¯¢ï¼") |
| | | private String month; |
| | | |
| | | @ApiModelProperty(value = "æ¥è¯¢å¹´ä»½ï¼æ ¼å¼yyyyï¼æå¹´æ¥è¯¢ï¼") |
| | | private String year; |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.doumee.dao.dto.invoice; |
| | | |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | import java.util.List; |
| | | |
| | | @Data |
| | | @ApiModel("A0001å¼å
·èååç¥¨æ°æ®") |
| | | public class InvoiceA0001DTO { |
| | | |
| | | @ApiModelProperty("ãå¿
å¡«ãåºå®åæ° API") |
| | | private String data_resources; |
| | | |
| | | @ApiModelProperty("å票类åï¼026-çµåæ®éå票 81-å
¨çµä¸ç¥¨ 82-å
¨çµæ®ç¥¨") |
| | | private String itype; |
| | | |
| | | @ApiModelProperty("ãå¿
å¡«ãé宿¹çº³ç¨äººè¯å«å·") |
| | | private String nsrsbh; |
| | | |
| | | @ApiModelProperty("ç¨æ§çå·ï¼ä½¿ç¨ç¨æ§çåå¿
å¡«ï¼å
¶ä»è®¾å¤ä¸ºç©ºï¼") |
| | | private String skph; |
| | | |
| | | @ApiModelProperty("ãå¿
å¡«ãä¸å¡åæ®å·ï¼å¿
é¡»å¯ä¸") |
| | | private String order_num; |
| | | |
| | | @ApiModelProperty("ãå¿
å¡«ãç¨æ¶ç¼ç çæ¬å·ï¼å¦29.0ï¼å
·ä½å¼è¯·è¯¢é®æä¾å") |
| | | private String bmb_bbh; |
| | | |
| | | @ApiModelProperty("ãå¿
å¡«ãå¾ç¨æ¹å¼ 0-æ®éå¾ç¨ 1-åæè®¡å¢ 2-å·®é¢å¾ç¨") |
| | | private String zsfs; |
| | | |
| | | @ApiModelProperty("ç¹æ®ç¥¨ç§æ è¯ 00-æ£å¸¸ç¥¨ç§ 01-å产åéå® 02-åäº§åæ¶è´") |
| | | private String tspz; |
| | | |
| | | @ApiModelProperty("ãå¿
å¡«ãé宿¹çº³ç¨äººè¯å«å·") |
| | | private String xsf_nsrsbh; |
| | | |
| | | @ApiModelProperty("ãå¿
å¡«ãé宿¹åç§°") |
| | | private String xsf_mc; |
| | | |
| | | @ApiModelProperty("ãå¿
å¡«ãé宿¹å°åãçµè¯") |
| | | private String xsf_dzdh; |
| | | |
| | | @ApiModelProperty("ãå¿
å¡«ãé宿¹å¼æ·è¡åç§°ä¸é¶è¡è´¦å·") |
| | | private String xsf_yhzh; |
| | | |
| | | @ApiModelProperty("è´ä¹°æ¹çº³ç¨äººè¯å«å·ï¼ä¼ä¸ç¨æ·ä¸ºå¿
填项ï¼") |
| | | private String gmf_nsrsbh; |
| | | |
| | | @ApiModelProperty("ãå¿
å¡«ãè´ä¹°æ¹åç§°") |
| | | private String gmf_mc; |
| | | |
| | | @ApiModelProperty("è´ä¹°æ¹å°åãçµè¯") |
| | | private String gmf_dzdh; |
| | | |
| | | @ApiModelProperty("è´ä¹°æ¹å¼æ·è¡åç§°ä¸é¶è¡è´¦å·") |
| | | private String gmf_yhzh; |
| | | |
| | | @ApiModelProperty("ãå¿
å¡«ãå¼ç¥¨äºº") |
| | | private String kpr; |
| | | |
| | | @ApiModelProperty("æ¶æ¬¾äºº") |
| | | private String skr; |
| | | |
| | | @ApiModelProperty("夿 ¸äºº") |
| | | private String fhr; |
| | | |
| | | @ApiModelProperty("åå票代ç ") |
| | | private String yfp_dm; |
| | | |
| | | @ApiModelProperty("åå票å·ç ") |
| | | private String yfp_hm; |
| | | |
| | | @ApiModelProperty("ãå¿
å¡«ãä»·ç¨å计ï¼å
ï¼2ä½å°æ°ï¼= å计éé¢(ä¸å«ç¨) + å计ç¨é¢") |
| | | private String jshj; |
| | | |
| | | @ApiModelProperty("ãå¿
å¡«ãå计éé¢ï¼ä¸å«ç¨ï¼å
ï¼2ä½å°æ°ï¼") |
| | | private String hjje; |
| | | |
| | | @ApiModelProperty("ãå¿
å¡«ãå计ç¨é¢ï¼å
ï¼2ä½å°æ°ï¼") |
| | | private String hjse; |
| | | |
| | | @ApiModelProperty("æ£é¤é¢ï¼2ä½å°æ°ï¼ï¼å½zsfs为2æ¶å¿
å¡«") |
| | | private String kce; |
| | | |
| | | @ApiModelProperty("夿³¨ï¼æé¿100å符ï¼") |
| | | private String bz; |
| | | |
| | | @ApiModelProperty("已失æï¼ä¸åæ¯æ") |
| | | private String kpzdbs; |
| | | |
| | | @ApiModelProperty("ææºå·ï¼ç¨æ§çå主å¨äº¤ä»æ¶å¡«å") |
| | | private String jff_phone; |
| | | |
| | | @ApiModelProperty("çµåé®ä»¶ï¼ç¨æ§çå主å¨äº¤ä»æ¶å¡«å") |
| | | private String jff_email; |
| | | |
| | | @ApiModelProperty("éç¨3%徿¶çåæ1%æ¿çæ¶çåå æ è¯ï¼2-åæå·²å¼ç¥¨é红å²éå¼ 3-æ¾å¼åæ1%æ¿ç") |
| | | private String sslkjly; |
| | | |
| | | @ApiModelProperty("ãå¿
å¡«ãååæç»å表") |
| | | private List<InvoiceA0001ItemDTO> common_fpkj_xmxx; |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.doumee.dao.dto.invoice; |
| | | |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | @Data |
| | | @ApiModel("A0001ååæç»") |
| | | public class InvoiceA0001ItemDTO { |
| | | |
| | | @ApiModelProperty("ãå¿
å¡«ãåç¥¨è¡æ§è´¨ 0-æ£å¸¸è¡ 1-ææ£è¡ 2-è¢«ææ£è¡") |
| | | private String fphxz; |
| | | |
| | | @ApiModelProperty("ãå¿
å¡«ãååç¼ç ï¼ç¨å¡æ»å±19ä½ç¨æ§ç¼ç ï¼") |
| | | private String spbm; |
| | | |
| | | @ApiModelProperty("èªè¡ç¼ç ï¼ä¸è¬ä¸å»ºè®®ä½¿ç¨ï¼") |
| | | private String zxbm; |
| | | |
| | | @ApiModelProperty("伿 æ¿çæ è¯ 0-ä¸ä½¿ç¨ 1-使ç¨") |
| | | private String yhzcbs; |
| | | |
| | | @ApiModelProperty("é¶ç¨çæ è¯ ç©º-éé¶ç¨ç 1-å
ç¨ 2-ä¸å¾æ¶ 3-æ®éé¶ç¨ç") |
| | | private String lslbs; |
| | | |
| | | @ApiModelProperty("å¢å¼ç¨ç¹æ®ç®¡çï¼yhzcbs为1æ¶å¿
å¡«ï¼å¼ä¸ºä¸æï¼") |
| | | private String zzstsgl; |
| | | |
| | | @ApiModelProperty("ãå¿
å¡«ã项ç®åç§°ï¼é¡»ä¸ååç¼ç 表ä¸è´ï¼") |
| | | private String xmmc; |
| | | |
| | | @ApiModelProperty("è§æ ¼åå·ï¼ææ£è¡ä¸ä¼ ï¼") |
| | | private String ggxh; |
| | | |
| | | @ApiModelProperty("计éåä½ï¼ææ£è¡ä¸ä¼ ï¼") |
| | | private String dw; |
| | | |
| | | @ApiModelProperty("é¡¹ç®æ°éï¼å°æ°ç¹å6ä½ï¼å¤§äº0ï¼") |
| | | private String xmsl; |
| | | |
| | | @ApiModelProperty("项ç®åä»·ï¼å«ç¨åä»·ï¼å°æ°ç¹å6ä½ï¼å¤§äº0ï¼") |
| | | private String xmdj; |
| | | |
| | | @ApiModelProperty("ãå¿
å¡«ã项ç®éé¢ï¼å«ç¨ï¼å
ï¼2ä½å°æ°ï¼") |
| | | private String xmje; |
| | | |
| | | @ApiModelProperty("ãå¿
å¡«ãç¨çï¼ä¾1%为0.01ï¼") |
| | | private String sl; |
| | | |
| | | @ApiModelProperty("ãå¿
å¡«ãç¨é¢ï¼å
ï¼2ä½å°æ°ï¼") |
| | | private String se; |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.doumee.dao.dto.invoice; |
| | | |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | @Data |
| | | @ApiModel("A0001å¼å
·èåå票请æ±") |
| | | public class InvoiceA0001Request { |
| | | |
| | | @ApiModelProperty("access_token") |
| | | private String access_token; |
| | | |
| | | @ApiModelProperty("serviceKey") |
| | | private String serviceKey; |
| | | |
| | | @ApiModelProperty("å¼ç¥¨æ°æ®") |
| | | private InvoiceA0001DTO data; |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.doumee.dao.dto.invoice; |
| | | |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | import java.util.List; |
| | | |
| | | @Data |
| | | @ApiModel("A0001å¼å
·èåå票ååº") |
| | | public class InvoiceA0001Result { |
| | | |
| | | @ApiModelProperty("æ¶æ¯") |
| | | private String msg; |
| | | |
| | | @ApiModelProperty("ç»æ SUCCESS/FAIL") |
| | | private String result; |
| | | |
| | | @ApiModelProperty("å票å表") |
| | | private List<InvoiceA0001ResultItem> rows; |
| | | |
| | | @ApiModelProperty("æ»æ°") |
| | | private String total; |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.doumee.dao.dto.invoice; |
| | | |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | import java.util.List; |
| | | |
| | | @Data |
| | | @ApiModel("A0001å¼å
·èååç¥¨ç»æé¡¹") |
| | | public class InvoiceA0001ResultItem { |
| | | |
| | | @ApiModelProperty("夿 ¸äºº") |
| | | private String fhr; |
| | | |
| | | @ApiModelProperty("é宿¹åç§°") |
| | | private String xsf_mc; |
| | | |
| | | @ApiModelProperty("åå票å·ç ") |
| | | private String yfp_hm; |
| | | |
| | | @ApiModelProperty("夿³¨") |
| | | private String bz; |
| | | |
| | | @ApiModelProperty("é宿¹é¶è¡è´¦å·") |
| | | private String xsf_yhzh; |
| | | |
| | | @ApiModelProperty("è´ä¹°æ¹åç§°") |
| | | private String gmf_mc; |
| | | |
| | | @ApiModelProperty("å计ç¨é¢") |
| | | private String hjse; |
| | | |
| | | @ApiModelProperty("å票代ç ") |
| | | private String fp_dm; |
| | | |
| | | @ApiModelProperty("æ£é¤é¢") |
| | | private String kce; |
| | | |
| | | @ApiModelProperty("åå票代ç ") |
| | | private String yfp_dm; |
| | | |
| | | @ApiModelProperty("å票å·ç ") |
| | | private String fp_hm; |
| | | |
| | | @ApiModelProperty("è´ä¹°æ¹çº³ç¨äººè¯å«å·") |
| | | private String gmf_nsrsbh; |
| | | |
| | | @ApiModelProperty("å票类å 026-çµç¥¨ 004-ä¸ç¥¨ 007-æ®ç¥¨ 025-å·ç¥¨") |
| | | private String itype; |
| | | |
| | | @ApiModelProperty("æ ¡éªç ") |
| | | private String jym; |
| | | |
| | | @ApiModelProperty("å¼ç¥¨ç±»å 0-èåå票 1-红åå票") |
| | | private String kplx; |
| | | |
| | | @ApiModelProperty("å票æ¸
åPDFæä»¶è·åkey") |
| | | private String pdf_item_key; |
| | | |
| | | @ApiModelProperty("ä¸å¡åæ®å·") |
| | | private String order_num; |
| | | |
| | | @ApiModelProperty("å¾ç¨æ¹å¼ 0-æ®éå¾ç¨ 2-å·®é¢å¾ç¨") |
| | | private String zsfs; |
| | | |
| | | @ApiModelProperty("é宿¹å°åãçµè¯") |
| | | private String xsf_dzdh; |
| | | |
| | | @ApiModelProperty("ç¨æ§è®¾å¤æºå¨ç¼å·") |
| | | private String jqbh; |
| | | |
| | | @ApiModelProperty("å计éé¢ï¼ä¸å«ç¨ï¼") |
| | | private String hjje; |
| | | |
| | | @ApiModelProperty("è´ä¹°æ¹å°åãçµè¯") |
| | | private String gmf_dzdh; |
| | | |
| | | @ApiModelProperty("åç¥¨è¯·æ±æµæ°´å·") |
| | | private String fpqqlsh; |
| | | |
| | | @ApiModelProperty("æ¶æ¬¾äºº") |
| | | private String skr; |
| | | |
| | | @ApiModelProperty("è´ä¹°æ¹é¶è¡è´¦å·") |
| | | private String gmf_yhzh; |
| | | |
| | | @ApiModelProperty("å¼ç¥¨äºº") |
| | | private String kpr; |
| | | |
| | | @ApiModelProperty("é宿¹çº³ç¨äººè¯å«å·") |
| | | private String xsf_nsrsbh; |
| | | |
| | | @ApiModelProperty("åç¥¨å¯æ") |
| | | private String fp_mw; |
| | | |
| | | @ApiModelProperty("ä»·ç¨å计") |
| | | private String jshj; |
| | | |
| | | @ApiModelProperty("å票PDFæä»¶è·åkey") |
| | | private String pdf_key; |
| | | |
| | | @ApiModelProperty("å¼ç¥¨æ¥æï¼yyyymmddhhmissï¼") |
| | | private String kprq; |
| | | |
| | | @ApiModelProperty("æåç ") |
| | | private String ext_code; |
| | | |
| | | @ApiModelProperty("ååæç»") |
| | | private List<InvoiceA0001ResultItemDetail> common_fpkj_xmxx; |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.doumee.dao.dto.invoice; |
| | | |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | @Data |
| | | @ApiModel("A0001ç»æååæç»") |
| | | public class InvoiceA0001ResultItemDetail { |
| | | |
| | | @ApiModelProperty("åç¥¨è¡æ§è´¨") |
| | | private String fphxz; |
| | | |
| | | @ApiModelProperty("ååç¼ç ") |
| | | private String spbm; |
| | | |
| | | @ApiModelProperty("èªè¡ç¼ç ") |
| | | private String zxbm; |
| | | |
| | | @ApiModelProperty("伿 æ¿çæ è¯") |
| | | private String yhzcbs; |
| | | |
| | | @ApiModelProperty("é¶ç¨çæ è¯") |
| | | private String lslbs; |
| | | |
| | | @ApiModelProperty("å¢å¼ç¨ç¹æ®ç®¡ç") |
| | | private String zzstsgl; |
| | | |
| | | @ApiModelProperty("项ç®åç§°") |
| | | private String xmmc; |
| | | |
| | | @ApiModelProperty("è§æ ¼åå·") |
| | | private String ggxh; |
| | | |
| | | @ApiModelProperty("计éåä½") |
| | | private String dw; |
| | | |
| | | @ApiModelProperty("é¡¹ç®æ°é") |
| | | private String xmsl; |
| | | |
| | | @ApiModelProperty("项ç®åä»·ï¼ä¸å«ç¨ï¼") |
| | | private String xmdj; |
| | | |
| | | @ApiModelProperty("项ç®éé¢ï¼ä¸å«ç¨ï¼") |
| | | private String xmje; |
| | | |
| | | @ApiModelProperty("ç¨ç") |
| | | private String sl; |
| | | |
| | | @ApiModelProperty("ç¨é¢") |
| | | private String se; |
| | | } |
| | |
| | | |
| | | @ApiModelProperty(value = "è¡æç±»åå æ¯") |
| | | private List<LuggageTypeItem> luggageTypeList; |
| | | |
| | | @ApiModelProperty(value = "é¨åºå
¥é©»çï¼å¦44.32表示44.32%ï¼") |
| | | private BigDecimal shopSettlementRate; |
| | | |
| | | @ApiModelProperty(value = "叿ºéè¿çï¼å¦44.32表示44.32%ï¼") |
| | | private BigDecimal driverPassRate; |
| | | |
| | | @ApiModelProperty(value = "卿鿬¾åæ°") |
| | | private Long refundOrderCount; |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.doumee.dao.vo; |
| | | |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | import java.io.Serializable; |
| | | |
| | | /** |
| | | * 叿ºæ ¸å¿ä¸ç»©ææ |
| | | * |
| | | * @Author : Rk |
| | | * @create 2026/05/15 |
| | | */ |
| | | @Data |
| | | @ApiModel("叿ºæ ¸å¿ä¸ç»©ææ ") |
| | | public class DriverKpiVO implements Serializable { |
| | | |
| | | @ApiModelProperty("æ»è®¢åéï¼å¼å°å¯å订åï¼ç¶æ1-7ï¼") |
| | | private Integer totalOrderCount; |
| | | |
| | | @ApiModelProperty("æ»å®æè®¢åéï¼ç¶æ=7ï¼") |
| | | private Integer finishedOrderCount; |
| | | |
| | | @ApiModelProperty("æ»è¥æ¶éé¢ï¼åï¼") |
| | | private Long totalRevenue; |
| | | |
| | | @ApiModelProperty("叿ºåæéé¢ï¼åï¼") |
| | | private Long driverFeeTotal; |
| | | |
| | | @ApiModelProperty("鿬¾åæ°") |
| | | private Integer refundOrderCount; |
| | | |
| | | @ApiModelProperty("è´£ä»»æ£æ¬¾æ»é¢ï¼åï¼") |
| | | private Long deductTotal; |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.doumee.dao.vo; |
| | | |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | import java.io.Serializable; |
| | | |
| | | /** |
| | | * 叿ºè¿ä¸æ¥è®¢åè¶å¿é¡¹ |
| | | * |
| | | * @Author : Rk |
| | | * @create 2026/05/15 |
| | | */ |
| | | @Data |
| | | @ApiModel("叿ºè¿ä¸æ¥è®¢åè¶å¿é¡¹") |
| | | public class DriverOrderTrendVO implements Serializable { |
| | | |
| | | @ApiModelProperty("æ¥æï¼yyyy-MM-ddï¼") |
| | | private String date; |
| | | |
| | | @ApiModelProperty("è®¢åæ°éï¼ç¶æ 3/4/5/7ï¼") |
| | | private Integer orderCount; |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.doumee.dao.vo; |
| | | |
| | | import com.doumee.dao.business.model.RewardRecord; |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | import java.io.Serializable; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * 叿ºå¥å±å¤§å
|
| | | * |
| | | * @Author : Rk |
| | | * @create 2026/05/15 |
| | | */ |
| | | @Data |
| | | @ApiModel("叿ºå¥å±å¤§å
") |
| | | public class DriverRewardHallVO implements Serializable { |
| | | |
| | | @ApiModelProperty("å·²é¢åå¥å±éé¢ï¼åï¼") |
| | | private Long claimedAmount; |
| | | |
| | | @ApiModelProperty("å¾
é¢åå¥å±éé¢ï¼åï¼") |
| | | private Long pendingAmount; |
| | | |
| | | @ApiModelProperty("注åå¥å±åæ°") |
| | | private String registerRewardOrderCount; |
| | | |
| | | @ApiModelProperty("注åå¥å±éé¢ï¼åï¼") |
| | | private String registerRewardAmount; |
| | | |
| | | @ApiModelProperty("å¹³å°å¥å±åæ°") |
| | | private String platformRewardOrderCount; |
| | | |
| | | @ApiModelProperty("å¹³å°å¥å±éé¢ï¼åï¼") |
| | | private String platformRewardAmount; |
| | | |
| | | @ApiModelProperty("å¥å±è®°å½å表") |
| | | private List<RewardRecord> records; |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.doumee.dao.vo; |
| | | |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | import java.io.Serializable; |
| | | import java.math.BigDecimal; |
| | | |
| | | @Data |
| | | @ApiModel("叿ºä¸ç»©Top10项") |
| | | public class DriverTopVO implements Serializable { |
| | | |
| | | @ApiModelProperty(value = "叿ºID") |
| | | private Integer driverId; |
| | | |
| | | @ApiModelProperty(value = "叿ºå§å") |
| | | private String driverName; |
| | | |
| | | @ApiModelProperty(value = "æ»å®æè®¢åé") |
| | | private Long completedCount; |
| | | |
| | | @ApiModelProperty(value = "æ»è¥æ¶éé¢ï¼å
ï¼") |
| | | private BigDecimal totalRevenue; |
| | | |
| | | @ApiModelProperty(value = "叿ºåææ»é¢ï¼å
ï¼") |
| | | private BigDecimal driverFeeTotal; |
| | | |
| | | @ApiModelProperty(value = "鿬¾åæ°") |
| | | private Long refundCount; |
| | | |
| | | @ApiModelProperty(value = "è´£ä»»æ£æ¬¾æ»é¢ï¼å
ï¼") |
| | | private BigDecimal penaltyAmount; |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.doumee.dao.vo; |
| | | |
| | | import com.doumee.core.annotation.excel.ExcelColumn; |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | import java.io.Serializable; |
| | | import java.math.BigDecimal; |
| | | |
| | | @Data |
| | | @ApiModel("å¹³å°è´¢å¡æ»è§é¡¹") |
| | | public class FinanceOverviewVO implements Serializable { |
| | | |
| | | @ExcelColumn(name = "å¹´æ", width = 14, index = 1) |
| | | @ApiModelProperty(value = "å¹´æï¼å¦2026-01ï¼") |
| | | private String date; |
| | | |
| | | @ExcelColumn(name = "å¯å订åè¥æ¶ï¼å
ï¼", width = 18, index = 2) |
| | | @ApiModelProperty(value = "å¯å订åè¥æ¶ï¼å
ï¼") |
| | | private BigDecimal storageRevenue; |
| | | |
| | | @ExcelColumn(name = "å¯é订åè¥æ¶ï¼å
ï¼", width = 18, index = 3) |
| | | @ApiModelProperty(value = "å¯é订åè¥æ¶ï¼å
ï¼") |
| | | private BigDecimal deliveryRevenue; |
| | | |
| | | @ExcelColumn(name = "平尿»è¥æ¶ï¼å
ï¼", width = 18, index = 4) |
| | | @ApiModelProperty(value = "平尿»è¥æ¶ï¼å
ï¼") |
| | | private BigDecimal totalRevenue; |
| | | |
| | | @ExcelColumn(name = "é¨åºåææ»é¢ï¼å
ï¼", width = 18, index = 5) |
| | | @ApiModelProperty(value = "é¨åºåææ»é¢ï¼å
ï¼") |
| | | private BigDecimal shopFeeTotal; |
| | | |
| | | @ExcelColumn(name = "叿ºåææ»é¢ï¼å
ï¼", width = 18, index = 6) |
| | | @ApiModelProperty(value = "叿ºåææ»é¢ï¼å
ï¼") |
| | | private BigDecimal driverFeeTotal; |
| | | |
| | | @ExcelColumn(name = "鿬¾æ»éé¢ï¼å
ï¼", width = 18, index = 7) |
| | | @ApiModelProperty(value = "鿬¾æ»éé¢ï¼å
ï¼") |
| | | private BigDecimal refundAmount; |
| | | |
| | | @ExcelColumn(name = "é¾æè´¹ç¨ï¼å
ï¼", width = 18, index = 8) |
| | | @ApiModelProperty(value = "é¾æè´¹ç¨ï¼å
ï¼") |
| | | private BigDecimal overdueAmount; |
| | | |
| | | @ExcelColumn(name = "å¹³å°åè¥æ¶ï¼å
ï¼", width = 18, index = 9) |
| | | @ApiModelProperty(value = "å¹³å°åè¥æ¶ï¼å
ï¼") |
| | | private BigDecimal netRevenue; |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.doumee.dao.vo; |
| | | |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | import java.io.Serializable; |
| | | |
| | | /** |
| | | * å票ç»è®¡æ±æ» |
| | | * |
| | | * @author rk |
| | | * @date 2026/05/18 |
| | | */ |
| | | @Data |
| | | @ApiModel("å票ç»è®¡æ±æ»") |
| | | public class InvoiceRecordSummaryVO implements Serializable { |
| | | |
| | | @ApiModelProperty("å¼ç¥¨æ»é¢ï¼åï¼= ç¬¦åæ¡ä»¶çææè®°å½ sum(invoiceAmount)") |
| | | private Long totalAmount; |
| | | |
| | | @ApiModelProperty("å·²å¼ç¥¨æ»é¢ï¼åï¼= status=1 ç sum(invoiceAmount)") |
| | | private Long issuedAmount; |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.doumee.dao.vo; |
| | | |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | import java.io.Serializable; |
| | | |
| | | /** |
| | | * ä½ç½®æ ç¾é¨åºæ°éç»è®¡ |
| | | * |
| | | * @Author : Rk |
| | | * @create 2026/05/15 |
| | | */ |
| | | @Data |
| | | @ApiModel("ä½ç½®æ ç¾é¨åºæ°éç»è®¡") |
| | | public class LocationTagShopCountVO implements Serializable { |
| | | |
| | | @ApiModelProperty("æ ç¾ä¸»é®") |
| | | private Integer tagId; |
| | | |
| | | @ApiModelProperty("æ ç¾åç§°") |
| | | private String tagName; |
| | | |
| | | @ApiModelProperty("é¨åºæ°é") |
| | | private Integer shopCount; |
| | | } |
| | |
| | | package com.doumee.dao.vo; |
| | | |
| | | import com.doumee.core.annotation.excel.ExcelColumn; |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | |
| | | @ApiModel("è¡æç±»åå æ¯é¡¹") |
| | | public class LuggageTypeItem implements Serializable { |
| | | |
| | | @ExcelColumn(name = "ç±»ååç§°", width = 20, index = 1) |
| | | @ApiModelProperty(value = "ç±»ååç§°") |
| | | private String luggageName; |
| | | |
| | | @ExcelColumn(name = "è®¢åæ°", width = 12, index = 2) |
| | | @ApiModelProperty(value = "è®¢åæ°") |
| | | private Long orderCount; |
| | | |
| | | @ExcelColumn(name = "è¡ææ°", width = 12, index = 3) |
| | | @ApiModelProperty(value = "è¡ææ°") |
| | | private Long luggageCount; |
| | | } |
| | |
| | | @ApiModelProperty(value = "ç¶æ 0=æ£å¸¸ï¼1=åç¨ï¼2=已注é") |
| | | private Integer status; |
| | | |
| | | @ExcelColumn(name = "é®ç®±", index = 6, width = 10) |
| | | @ApiModelProperty(value = "é®ç®±") |
| | | private String email; |
| | | |
| | | } |
| | |
| | | @ApiModelProperty(value = "åä»¶é¨åºèç³»çµè¯") |
| | | private String depositShopPhone; |
| | | |
| | | @ApiModelProperty(value = "åä»¶é¨åºå°å") |
| | | private String depositShopAddress; |
| | | |
| | | // ---- åä»¶ä¿¡æ¯ ---- |
| | | |
| | | @ApiModelProperty(value = "åä»¶é¨åºä¸»é®ï¼æåä»¶é¨åºæ¶è¿åï¼") |
| | |
| | | |
| | | @ApiModelProperty(value = "ä¸åç
§ç") |
| | | private List<String> orderImages; |
| | | |
| | | @ApiModelProperty(value = "å¯å¼ç¥¨éé¢ï¼åï¼= æ¯ä»éé¢ - 鿬¾éé¢") |
| | | private Long invoiceAmount; |
| | | |
| | | @ApiModelProperty(value = "伿 叿µæ£éé¢ï¼åï¼") |
| | | private Long deductionAmount; |
| | | } |
| | |
| | | |
| | | @ApiModelProperty(value = "åºå·") |
| | | private String sortnum; |
| | | |
| | | @ApiModelProperty(value = "伿 叿µæ£éé¢ï¼åï¼") |
| | | private Long deductionAmount; |
| | | } |
| | |
| | | @ApiModelProperty(value = "叿ºå·²ç»ç®è´¹ç¨ï¼åï¼") |
| | | private Long settledDriverFeeSum; |
| | | |
| | | @ApiModelProperty(value = "å®ä»éé¢å计ï¼åï¼= æ¯ä»éé¢ - 鿬¾éé¢ + é¾æè´¹ç¨") |
| | | private Long actualPayAmountSum; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.doumee.dao.vo; |
| | | |
| | | import com.doumee.core.annotation.excel.ExcelColumn; |
| | | import lombok.Data; |
| | | |
| | | import java.util.Date; |
| | | |
| | | @Data |
| | | public class OrdersExportVO { |
| | | |
| | | @ExcelColumn(name = "订åç¼å·", index = 0) |
| | | private String code; |
| | | |
| | | @ExcelColumn(name = "ç©åä¿¡æ¯", index = 1) |
| | | private String goodsInfo; |
| | | |
| | | @ExcelColumn(name = "ç±»å", index = 2) |
| | | private String typeName; |
| | | |
| | | @ExcelColumn(name = "订å级å«", index = 3) |
| | | private String orderLevel; |
| | | |
| | | @ExcelColumn(name = "ç©åä¿è´¹(å
)", index = 4) |
| | | private String declaredFee; |
| | | |
| | | @ExcelColumn(name = "åºç¡æå¡è´¹(å
)", index = 5) |
| | | private String basicAmount; |
| | | |
| | | @ExcelColumn(name = "è®¢åæ»ä»·(å
)", index = 6) |
| | | private String totalAmount; |
| | | |
| | | @ExcelColumn(name = "å®ä»ç°é(å
)", index = 7) |
| | | private String payAmount; |
| | | |
| | | @ExcelColumn(name = "å æ¥è´¹(å
)", index = 8) |
| | | private String urgentAmount; |
| | | |
| | | @ExcelColumn(name = "鿬¾éé¢(å
)", index = 9) |
| | | private String refundAmount; |
| | | |
| | | @ExcelColumn(name = "è¶
æ¶éé¢(å
)", index = 10) |
| | | private String overdueAmount; |
| | | |
| | | @ExcelColumn(name = "å¼å¸¸éé¢(å
)", index = 11) |
| | | private String exceptionAmount; |
| | | |
| | | @ExcelColumn(name = "伿 叿æ£(å
)", index = 12) |
| | | private String deductionAmount; |
| | | |
| | | @ExcelColumn(name = "订åç¶æ", index = 13) |
| | | private String statusDesc; |
| | | |
| | | @ExcelColumn(name = "ç»ç®ç¶æ", index = 14) |
| | | private String settlementDesc; |
| | | |
| | | @ExcelColumn(name = "æ¯ä»æ¶é´", index = 15, dateFormat = "yyyy-MM-dd HH:mm:ss", width = 16) |
| | | private Date payTime; |
| | | |
| | | @ExcelColumn(name = "å建æ¶é´", index = 16, dateFormat = "yyyy-MM-dd HH:mm:ss", width = 16) |
| | | private Date createTime; |
| | | } |
| | |
| | | package com.doumee.dao.vo; |
| | | |
| | | import com.doumee.dao.business.model.MemberCoupon; |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | |
| | | |
| | | @ApiModelProperty("天æ°") |
| | | private Integer days; |
| | | |
| | | @ApiModelProperty("伿 éé¢ï¼åï¼") |
| | | private Long deductionAmount; |
| | | |
| | | @ApiModelProperty("éä¸ç伿 å¸ä¿¡æ¯") |
| | | private MemberCoupon selectedCoupon; |
| | | |
| | | @ApiModelProperty("å¯ç¨ä¼æ å¸å表ï¼éé¢ååºãå°ææ¶é´é¡ºåºï¼") |
| | | private List<MemberCoupon> availableCoupons; |
| | | } |
| | |
| | | |
| | | @ApiModelProperty(value = "å
³èæ£å¼çæ¬é¨åºä¸»é®") |
| | | private Integer relationShopId; |
| | | |
| | | @ApiModelProperty(value = "ä½ç½®æ ç¾ä¸»é®ï¼éå·åéï¼") |
| | | private String locationTagIds; |
| | | |
| | | @ApiModelProperty(value = "ä½ç½®æ ç¾åç§°ï¼éå·åéï¼") |
| | | private String locationTagNames; |
| | | |
| | | @ApiModelProperty(value = "é¨åºå¤´å") |
| | | private String coverImg; |
| | | |
| | | @ApiModelProperty(value = "é¨åºå¤´åï¼å
¨è·¯å¾ï¼") |
| | | private String coverImgUrl; |
| | | |
| | | @ApiModelProperty(value = "é¨åºä»ç»") |
| | | private String content; |
| | | |
| | | @ApiModelProperty(value = "å¯åç±»å") |
| | | private String depositTypes; |
| | | |
| | | @ApiModelProperty(value = "æ¶è´¹æ å") |
| | | private String feeStandard; |
| | | |
| | | @ApiModelProperty(value = "é¨åºè¥ä¸æ¶é´") |
| | | private String shopHours; |
| | | |
| | | @ApiModelProperty(value = "é¨åºè¥ä¸ç±»åï¼0=éå
¨å¤©ï¼1=å
¨å¤©") |
| | | private Integer businessType; |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.doumee.dao.vo; |
| | | |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | import java.io.Serializable; |
| | | |
| | | /** |
| | | * é¨åºæ ¸å¿ä¸ç»©ææ |
| | | * |
| | | * @Author : Rk |
| | | * @create 2026/05/15 |
| | | */ |
| | | @Data |
| | | @ApiModel("é¨åºæ ¸å¿ä¸ç»©ææ ") |
| | | public class ShopKpiVO implements Serializable { |
| | | |
| | | @ApiModelProperty("å¯å订åéï¼å°±å°å¯åï¼ç¶æ1-7ï¼") |
| | | private Integer localOrderCount; |
| | | |
| | | @ApiModelProperty("å¯é订åéï¼å¼å°å¯åï¼ç¶æ1-7ï¼") |
| | | private Integer remoteOrderCount; |
| | | |
| | | @ApiModelProperty("æ»è®¢åé") |
| | | private Integer totalOrderCount; |
| | | |
| | | @ApiModelProperty("æ»å®æè®¢åéï¼ç¶æ=7ï¼") |
| | | private Integer finishedOrderCount; |
| | | |
| | | @ApiModelProperty("æ»è¥æ¶éé¢ï¼åï¼") |
| | | private Long totalRevenue; |
| | | |
| | | @ApiModelProperty("é¨åºåæéé¢ï¼åï¼") |
| | | private Long shopFeeTotal; |
| | | |
| | | @ApiModelProperty("鿬¾åæ°") |
| | | private Integer refundOrderCount; |
| | | |
| | | @ApiModelProperty("è´£ä»»æ£æ¬¾æ»é¢ï¼åï¼") |
| | | private Long deductTotal; |
| | | } |
| | |
| | | |
| | | @ApiModelProperty(value = "é¨åºç»åº¦") |
| | | private Double longitude; |
| | | } |
| | | |
| | | @ApiModelProperty(value = "ä½ç½®æ ç¾åç§°ï¼éå·åéï¼") |
| | | private String locationTagNames; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.doumee.dao.vo; |
| | | |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | import java.io.Serializable; |
| | | import java.math.BigDecimal; |
| | | |
| | | @Data |
| | | @ApiModel("é¨åºä¸ç»©Top10项") |
| | | public class ShopTopVO implements Serializable { |
| | | |
| | | @ApiModelProperty(value = "é¨åºID") |
| | | private Integer shopId; |
| | | |
| | | @ApiModelProperty(value = "é¨åºåç§°") |
| | | private String shopName; |
| | | |
| | | @ApiModelProperty(value = "æ»å®æè®¢åé") |
| | | private Long completedCount; |
| | | |
| | | @ApiModelProperty(value = "æ»è¥æ¶éé¢ï¼å
ï¼") |
| | | private BigDecimal totalRevenue; |
| | | |
| | | @ApiModelProperty(value = "é¨åºåææ»é¢ï¼å
ï¼") |
| | | private BigDecimal shopFeeTotal; |
| | | |
| | | @ApiModelProperty(value = "鿬¾åæ°") |
| | | private Long refundCount; |
| | | |
| | | @ApiModelProperty(value = "è´£ä»»æ£æ¬¾æ»é¢ï¼å
ï¼") |
| | | private BigDecimal penaltyAmount; |
| | | } |
| | |
| | | |
| | | @ApiModelProperty(value = "é¨åºèç³»çµè¯") |
| | | private String linkPhone; |
| | | |
| | | @ApiModelProperty(value = "ä½ç½®æ ç¾åç§°ï¼éå·åéï¼") |
| | | private String locationTagNames; |
| | | } |
| | |
| | | @ApiModelProperty(value = "æå½åç»å®çé¨åº") |
| | | private String bindShopId; |
| | | |
| | | @ApiModelProperty(value = "é®ç®±") |
| | | private String email; |
| | | |
| | | |
| | | |
| | | } |
| | |
| | | package com.doumee.service.business; |
| | | |
| | | import com.doumee.dao.dto.DataBoardQueryDTO; |
| | | import com.doumee.dao.dto.FinanceQueryDTO; |
| | | import com.doumee.dao.dto.TrendQueryDTO; |
| | | import com.doumee.dao.vo.*; |
| | | |
| | | import java.util.List; |
| | |
| | | |
| | | DataBoardVO overview(DataBoardQueryDTO query); |
| | | |
| | | List<MemberTrendVO> memberTrend(); |
| | | List<MemberTrendVO> memberTrend(TrendQueryDTO query); |
| | | |
| | | List<OrderTrendVO> orderTrend(); |
| | | List<OrderTrendVO> orderTrend(TrendQueryDTO query); |
| | | |
| | | List<RevenueTrendVO> revenueTrend(); |
| | | List<RevenueTrendVO> revenueTrend(TrendQueryDTO query); |
| | | |
| | | ShopPerformanceVO shopPerformance(DataBoardQueryDTO query); |
| | | |
| | | List<LuggageTypeItem> luggageTypeList(DataBoardQueryDTO query); |
| | | |
| | | List<FinanceOverviewVO> financeOverview(FinanceQueryDTO query); |
| | | |
| | | List<ShopTopVO> shopTop(TrendQueryDTO query); |
| | | |
| | | List<DriverTopVO> driverTop(TrendQueryDTO query); |
| | | |
| | | /** |
| | | * æ ¹æ®è®¢åIDå表æå»ºè¡æç±»ååå¸ |
| | | */ |
| | | List<LuggageTypeItem> buildLuggageTypeList(List<Integer> orderIds); |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.doumee.service.business; |
| | | |
| | | import com.doumee.core.model.PageData; |
| | | import com.doumee.core.model.PageWrap; |
| | | import com.doumee.dao.business.model.InvoiceRecord; |
| | | import com.doumee.dao.dto.ApplyInvoiceDTO; |
| | | import com.doumee.dao.vo.InvoiceRecordSummaryVO; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * å票ç³è¯·è®°å½Serviceå®ä¹ |
| | | * |
| | | * @author rk |
| | | * @date 2026/05/18 |
| | | */ |
| | | public interface InvoiceRecordService { |
| | | |
| | | Integer create(InvoiceRecord invoiceRecord); |
| | | |
| | | void deleteById(Integer id); |
| | | |
| | | void delete(InvoiceRecord invoiceRecord); |
| | | |
| | | void deleteByIdInBatch(List<Integer> ids); |
| | | |
| | | void updateById(InvoiceRecord invoiceRecord); |
| | | |
| | | void updateByIdInBatch(List<InvoiceRecord> invoiceRecords); |
| | | |
| | | InvoiceRecord findById(Integer id); |
| | | |
| | | InvoiceRecord findOne(InvoiceRecord invoiceRecord); |
| | | |
| | | List<InvoiceRecord> findList(InvoiceRecord invoiceRecord); |
| | | |
| | | PageData<InvoiceRecord> findPage(PageWrap<InvoiceRecord> pageWrap); |
| | | |
| | | long count(InvoiceRecord invoiceRecord); |
| | | |
| | | /** |
| | | * ä¼åç³è¯·å¼ç¥¨ |
| | | * |
| | | * @param dto å¼ç¥¨ç³è¯·è¯·æ± |
| | | * @param memberId ä¼åä¸»é® |
| | | */ |
| | | void applyInvoice(ApplyInvoiceDTO dto, Integer memberId); |
| | | |
| | | /** |
| | | * ä¼åå¼ç¥¨è®°å½åé¡µï¼æå建æ¶é´ååºï¼ |
| | | */ |
| | | PageData<InvoiceRecord> findMemberInvoicePage(PageWrap<InvoiceRecord> pageWrap, Integer memberId); |
| | | |
| | | /** |
| | | * åéå票é®ä»¶ |
| | | */ |
| | | void sendInvoiceEmail(Integer memberId, Integer invoiceRecordId, String email); |
| | | |
| | | /** |
| | | * å票ç»è®¡æ±æ»ï¼ä¸ findPage ç¸åçéæ¡ä»¶ï¼ |
| | | */ |
| | | InvoiceRecordSummaryVO findPageSummary(PageWrap<InvoiceRecord> pageWrap); |
| | | } |
| | |
| | | PageData<MemberCoupon> findPage(PageWrap<MemberCoupon> pageWrap); |
| | | |
| | | long count(MemberCoupon memberCoupon); |
| | | |
| | | PageData<MemberCoupon> findMemberPage(Integer memberId, Integer status, PageWrap<MemberCoupon> pageWrap); |
| | | |
| | | void claimCoupon(Integer memberId, Integer couponId); |
| | | } |
| | |
| | | import com.doumee.core.model.PageData; |
| | | import com.doumee.core.model.PageWrap; |
| | | import com.doumee.dao.business.model.Orders; |
| | | import com.doumee.dao.business.model.OrdersRefund; |
| | | import com.doumee.dao.dto.CalculateLocalPriceDTO; |
| | | import com.doumee.dao.dto.CalculateRemotePriceDTO; |
| | | import com.doumee.dao.dto.CreateOrderDTO; |
| | | import com.doumee.dao.dto.HandleOrderExceptionDTO; |
| | | import com.doumee.dao.dto.ManualRefundDTO; |
| | | import com.doumee.dao.dto.DispatchDTO; |
| | | import com.doumee.dao.dto.CommentOrderDTO; |
| | | import com.doumee.dao.dto.MyOrderDTO; |
| | |
| | | void settleOrders(); |
| | | |
| | | /** |
| | | * æå¨é款 |
| | | */ |
| | | void manualRefund(ManualRefundDTO dto, Integer userId); |
| | | |
| | | /** |
| | | * å¤çæå¨éæ¬¾çæ£æ¬¾é»è¾ï¼é款åè°æåæ¶è°ç¨ï¼ |
| | | */ |
| | | void processManualRefundCallback(OrdersRefund refundRecord); |
| | | |
| | | /** |
| | | * 订åè¯ä»· |
| | | * status=7ä¸commentStatus=0æ¶å¯è¯ä»·ï¼æå¯¹è±¡ï¼åä»¶é¨åº/åä»¶é¨åº/叿ºï¼åå«è®°å½è¯å |
| | | * |
| | |
| | | int notifyArrivalPickUp(); |
| | | |
| | | /** |
| | | * 订åå¼å¸¸å¤çï¼å¼å°æ åä»¶é¨åºå·²é达订åï¼å建就å°ååæ°è®¢å |
| | | */ |
| | | void handleOrderException(HandleOrderExceptionDTO dto); |
| | | |
| | | /** |
| | | * æ ¡éªæä½åå¾ |
| | | * @param orderId 订åä¸»é® |
| | | * @param userId æä½ç¨æ·ä¸»é® |
| | |
| | | import com.doumee.core.model.PageWrap; |
| | | import com.doumee.dao.business.model.Revenue; |
| | | import com.doumee.dao.dto.RevenueQueryDTO; |
| | | import com.doumee.dao.vo.DriverKpiVO; |
| | | import com.doumee.dao.vo.DriverOrderTrendVO; |
| | | import com.doumee.dao.vo.DriverRewardHallVO; |
| | | import com.doumee.dao.vo.RevenueStatisticsVO; |
| | | import com.doumee.dao.vo.RevenueSummaryVO; |
| | | |
| | |
| | | */ |
| | | RevenueSummaryVO getShopRevenueSummary(RevenueQueryDTO queryDTO, Integer shopId); |
| | | |
| | | /** |
| | | * 叿ºæ ¸å¿ä¸ç»©ææ |
| | | * |
| | | * @param driverId 叿ºä¸»é® |
| | | * @param query æ¥æèå´ |
| | | * @return KPI |
| | | */ |
| | | DriverKpiVO getDriverKpi(Integer driverId, com.doumee.dao.dto.ShopRevenueQueryDTO query); |
| | | |
| | | /** |
| | | * 叿ºè¿ä¸æ¥è®¢åè¶å¿ |
| | | * |
| | | * @param driverId 叿ºä¸»é® |
| | | * @return 7天è¶å¿æ°æ® |
| | | */ |
| | | List<DriverOrderTrendVO> getDriverOrderTrend(Integer driverId); |
| | | |
| | | /** |
| | | * 叿ºå¥å±å¤§å
|
| | | * |
| | | * @param driverId 叿ºä¸»é® |
| | | * @return å¥å±å¤§å
æ°æ® |
| | | */ |
| | | DriverRewardHallVO getDriverRewardHall(Integer driverId); |
| | | |
| | | /** |
| | | * é¢åå¥å±é |
| | | * |
| | | * @param driverId 叿ºä¸»é® |
| | | * @param rewardRecordId å¥å±è®°å½ID |
| | | */ |
| | | void claimReward(Integer driverId, Integer rewardRecordId); |
| | | |
| | | } |
| | |
| | | import com.doumee.dao.business.model.ShopInfo; |
| | | import com.doumee.dao.business.model.Member; |
| | | import com.doumee.dao.dto.*; |
| | | import com.doumee.dao.vo.LocationTagShopCountVO; |
| | | import com.doumee.dao.vo.LuggageTypeItem; |
| | | import com.doumee.dao.vo.ShopKpiVO; |
| | | import com.doumee.dao.vo.ShopLoginVO; |
| | | import com.doumee.dao.vo.ShopCenterVO; |
| | | import com.doumee.dao.vo.ShopDetailVO; |
| | |
| | | PageData<ShopNearbyVO> findNearbyShops(PageWrap<ShopNearbyDTO> pageWrap); |
| | | |
| | | /** |
| | | * æä½ç½®æ ç¾ç»è®¡é¨åºæ°é |
| | | * @param cityId åå¸ä¸»é®ï¼å¯éï¼ |
| | | * @return æ ç¾é¨åºæ°éå表 |
| | | */ |
| | | List<LocationTagShopCountVO> countShopsByLocationTag(Integer cityId); |
| | | |
| | | /** |
| | | * æ¥è¯¢é¨åºè¯¦æ
ï¼å°ç¨åºç«¯ï¼å«ç
§çéååå¯éè·ç¦»ï¼ |
| | | * @param dto æ¥è¯¢è¯·æ± |
| | | * @return é¨åºè¯¦æ
|
| | |
| | | ShopSalesStatsVO getShopSalesStats(Integer shopId, Integer period); |
| | | |
| | | /** |
| | | * é¨åºè¡æç±»ååå¸ |
| | | */ |
| | | List<LuggageTypeItem> shopLuggageTypeList(Integer shopId, ShopRevenueQueryDTO query); |
| | | |
| | | /** |
| | | * é¨åºæ ¸å¿ä¸ç»©ææ |
| | | */ |
| | | ShopKpiVO getShopKpi(Integer shopId, ShopRevenueQueryDTO query); |
| | | |
| | | /** |
| | | * é¨åºä¿®æ¹å¯ç |
| | | * |
| | | * @param shopId é¨åºä¸»é® |
| | |
| | | throw new BusinessException(ResponseStatus.BAD_REQUEST); |
| | | } |
| | | // type=2ï¼å¯å说æï¼detailä¸å¿
å¡«ï¼å
¶ä»ç±»åå¿
å¡« |
| | | if (!Constants.equalsInteger(category.getType(), Constants.TWO) && StringUtils.isBlank(category.getDetail())) { |
| | | if (!Constants.equalsInteger(category.getType(), Constants.TWO)&& !Constants.equalsInteger(category.getType(), Constants.FIVE) && StringUtils.isBlank(category.getDetail())) { |
| | | throw new BusinessException(ResponseStatus.BAD_REQUEST); |
| | | } |
| | | validateByType(category); |
| | |
| | | throw new BusinessException(ResponseStatus.BAD_REQUEST); |
| | | } |
| | | // type=2ï¼å¯å说æï¼detailä¸å¿
å¡«ï¼å
¶ä»ç±»åå¿
å¡« |
| | | if (!Constants.equalsInteger(category.getType(), Constants.TWO) && StringUtils.isBlank(category.getDetail())) { |
| | | if (!Constants.equalsInteger(category.getType(), Constants.TWO) && !Constants.equalsInteger(category.getType(), Constants.FIVE) && StringUtils.isBlank(category.getDetail())) { |
| | | throw new BusinessException(ResponseStatus.BAD_REQUEST); |
| | | } |
| | | validateByType(category); |
| | |
| | | import com.doumee.dao.business.*; |
| | | import com.doumee.dao.business.model.*; |
| | | import com.doumee.dao.dto.DataBoardQueryDTO; |
| | | import com.doumee.dao.dto.FinanceQueryDTO; |
| | | import com.doumee.dao.dto.TrendQueryDTO; |
| | | import com.doumee.dao.vo.*; |
| | | import com.doumee.service.business.DataBoardService; |
| | | import lombok.extern.slf4j.Slf4j; |
| | |
| | | private OtherOrdersMapper otherOrdersMapper; |
| | | @Autowired |
| | | private OrdersRefundMapper ordersRefundMapper; |
| | | @Autowired |
| | | private RevenueMapper revenueMapper; |
| | | |
| | | @Override |
| | | public DataBoardVO overview(DataBoardQueryDTO query) { |
| | | query.resolveDateRange(); |
| | | DataBoardVO vo = new DataBoardVO(); |
| | | // ä¼åæ»æ°ï¼ä¸åæ¶é´/é¨åºå½±åï¼ |
| | | // ä¼åæ»æ°ï¼ä¸åæ¶é´/é¨åºå½±åï¼userType=0 ä¼åèº«ä»½ï¼ |
| | | vo.setMemberCount(memberMapper.selectCount(new QueryWrapper<Member>().lambda() |
| | | .eq(Member::getDeleted, Constants.ZERO) |
| | | .eq(Member::getStatus, Constants.ZERO))); |
| | | .eq(Member::getUserType, Constants.ZERO))); |
| | | // é¨åºæ»æ°ï¼auditStatus=3 æ£å¼çæ¬ï¼ |
| | | vo.setShopCount(shopInfoMapper.selectCount(new QueryWrapper<ShopInfo>().lambda() |
| | | .eq(ShopInfo::getAuditStatus, Constants.THREE) |
| | |
| | | |
| | | // è¡æç±»åå æ¯ |
| | | List<Integer> orderIds = orders.stream().map(Orders::getId).collect(Collectors.toList()); |
| | | List<LuggageTypeItem> luggageTypeList = new ArrayList<>(); |
| | | if (!orderIds.isEmpty()) { |
| | | List<OrdersDetail> details = ordersDetailMapper.selectList(new QueryWrapper<OrdersDetail>().lambda() |
| | | .in(OrdersDetail::getOrderId, orderIds) |
| | | .eq(OrdersDetail::getDeleted, Constants.ZERO)); |
| | | Map<String, List<OrdersDetail>> grouped = details.stream() |
| | | .filter(d -> StringUtils.isNotBlank(d.getLuggageName())) |
| | | .collect(Collectors.groupingBy(OrdersDetail::getLuggageName)); |
| | | for (Map.Entry<String, List<OrdersDetail>> entry : grouped.entrySet()) { |
| | | LuggageTypeItem item = new LuggageTypeItem(); |
| | | item.setLuggageName(entry.getKey()); |
| | | item.setOrderCount((long) entry.getValue().stream().map(OrdersDetail::getOrderId).distinct().count()); |
| | | item.setLuggageCount((long) entry.getValue().stream() |
| | | .mapToInt(d -> d.getNum() != null ? d.getNum() : 0).sum()); |
| | | luggageTypeList.add(item); |
| | | } |
| | | vo.setLuggageTypeList(buildLuggageTypeList(orderIds)); |
| | | |
| | | // é¨åºå
¥é©»çï¼auditStatus=3 çé¨åºæ° / å
¨é¨é¨åºæ° |
| | | long totalShopCount = shopInfoMapper.selectCount(new QueryWrapper<ShopInfo>().lambda() |
| | | .eq(ShopInfo::getVersionType, Constants.ZERO) |
| | | .eq(ShopInfo::getDeleted, Constants.ZERO)); |
| | | if (totalShopCount > 0) { |
| | | vo.setShopSettlementRate(BigDecimal.valueOf(vo.getShopCount()) |
| | | .multiply(BigDecimal.valueOf(100)) |
| | | .divide(BigDecimal.valueOf(totalShopCount), 2, RoundingMode.HALF_UP)); |
| | | } else { |
| | | vo.setShopSettlementRate(BigDecimal.ZERO); |
| | | } |
| | | vo.setLuggageTypeList(luggageTypeList); |
| | | |
| | | // 叿ºéè¿çï¼auditStatus=3 ç叿ºæ° / å
¨é¨å¸æºæ° |
| | | long totalDriverCount = driverInfoMapper.selectCount(new QueryWrapper<DriverInfo>().lambda() |
| | | .eq(DriverInfo::getVersionType, Constants.ZERO) |
| | | .eq(DriverInfo::getDeleted, Constants.ZERO)); |
| | | if (totalDriverCount > 0) { |
| | | vo.setDriverPassRate(BigDecimal.valueOf(vo.getDriverCount()) |
| | | .multiply(BigDecimal.valueOf(100)) |
| | | .divide(BigDecimal.valueOf(totalDriverCount), 2, RoundingMode.HALF_UP)); |
| | | } else { |
| | | vo.setDriverPassRate(BigDecimal.ZERO); |
| | | } |
| | | |
| | | // 卿鿬¾åæ° |
| | | if (!orderIds.isEmpty()) { |
| | | QueryWrapper<OrdersRefund> refundQw = new QueryWrapper<>(); |
| | | refundQw.lambda() |
| | | .in(OrdersRefund::getOrderId, orderIds) |
| | | .eq(OrdersRefund::getStatus, Constants.ONE) |
| | | .eq(OrdersRefund::getDeleted, Constants.ZERO); |
| | | List<OrdersRefund> refundRecords = ordersRefundMapper.selectList(refundQw); |
| | | vo.setRefundOrderCount(refundRecords.stream() |
| | | .map(OrdersRefund::getOrderId).distinct().count()); |
| | | } else { |
| | | vo.setRefundOrderCount(0L); |
| | | } |
| | | |
| | | return vo; |
| | | } |
| | | |
| | | @Override |
| | | public List<MemberTrendVO> memberTrend() { |
| | | Date startDate = get30DaysAgoStart(); |
| | | public List<MemberTrendVO> memberTrend(TrendQueryDTO query) { |
| | | TrendDateRange range = parseTrendDateRange(query); |
| | | List<Member> members = memberMapper.selectList(new QueryWrapper<Member>().lambda() |
| | | .eq(Member::getDeleted, Constants.ZERO) |
| | | .eq(Member::getStatus, Constants.ZERO) |
| | | .ge(Member::getCreateTime, startDate)); |
| | | .eq(Member::getUserType, Constants.ZERO) |
| | | .ge(Member::getCreateTime, range.startDate) |
| | | .le(Member::getCreateTime, range.endDate)); |
| | | |
| | | SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); |
| | | SimpleDateFormat sdf = new SimpleDateFormat(range.pattern); |
| | | Map<String, Long> map = members.stream() |
| | | .collect(Collectors.groupingBy(m -> sdf.format(m.getCreateTime()), Collectors.counting())); |
| | | |
| | | return buildDailyList(startDate, (date) -> { |
| | | return buildTrendList(range, (date) -> { |
| | | MemberTrendVO vo = new MemberTrendVO(); |
| | | vo.setDate(date); |
| | | vo.setCount(map.getOrDefault(date, 0L)); |
| | |
| | | } |
| | | |
| | | @Override |
| | | public List<OrderTrendVO> orderTrend() { |
| | | Date startDate = get30DaysAgoStart(); |
| | | public List<OrderTrendVO> orderTrend(TrendQueryDTO query) { |
| | | TrendDateRange range = parseTrendDateRange(query); |
| | | List<Orders> orders = ordersMapper.selectList(new QueryWrapper<Orders>().lambda() |
| | | .eq(Orders::getDeleted, Constants.ZERO) |
| | | .in(Orders::getStatus, |
| | | Constants.OrderStatus.waitDeposit.getKey(), |
| | | Constants.OrderStatus.deposited.getKey(), |
| | | Constants.OrderStatus.accepted.getKey(), |
| | | Constants.OrderStatus.delivering.getKey(), |
| | | Constants.OrderStatus.arrived.getKey(), |
| | | Constants.OrderStatus.overdue.getKey()) |
| | | .ge(Orders::getCreateTime, startDate)); |
| | | .ge(Orders::getCreateTime, range.startDate) |
| | | .le(Orders::getCreateTime, range.endDate)); |
| | | |
| | | SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); |
| | | SimpleDateFormat sdf = new SimpleDateFormat(range.pattern); |
| | | Map<String, List<Orders>> grouped = orders.stream() |
| | | .collect(Collectors.groupingBy(o -> sdf.format(o.getCreateTime()))); |
| | | |
| | | return buildDailyList(startDate, (date) -> { |
| | | return buildTrendList(range, (date) -> { |
| | | List<Orders> dayOrders = grouped.getOrDefault(date, Collections.emptyList()); |
| | | OrderTrendVO vo = new OrderTrendVO(); |
| | | vo.setDate(date); |
| | |
| | | } |
| | | |
| | | @Override |
| | | public List<RevenueTrendVO> revenueTrend() { |
| | | Date startDate = get30DaysAgoStart(); |
| | | public List<RevenueTrendVO> revenueTrend(TrendQueryDTO query) { |
| | | TrendDateRange range = parseTrendDateRange(query); |
| | | SimpleDateFormat sdf = new SimpleDateFormat(range.pattern); |
| | | |
| | | List<Orders> orders = ordersMapper.selectList(new QueryWrapper<Orders>().lambda() |
| | | .eq(Orders::getDeleted, Constants.ZERO) |
| | | .in(Orders::getStatus, |
| | | Constants.OrderStatus.waitDeposit.getKey(), |
| | | Constants.OrderStatus.deposited.getKey(), |
| | | Constants.OrderStatus.accepted.getKey(), |
| | | Constants.OrderStatus.delivering.getKey(), |
| | | Constants.OrderStatus.arrived.getKey(), |
| | | Constants.OrderStatus.overdue.getKey()) |
| | | .ge(Orders::getCreateTime, startDate)); |
| | | Constants.OrderStatus.waitDeposit.getKey(), |
| | | Constants.OrderStatus.deposited.getKey(), |
| | | Constants.OrderStatus.accepted.getKey(), |
| | | Constants.OrderStatus.delivering.getKey(), |
| | | Constants.OrderStatus.arrived.getKey(), |
| | | Constants.OrderStatus.overdue.getKey(), |
| | | Constants.OrderStatus.finished.getKey()) |
| | | .ge(Orders::getCreateTime, range.startDate) |
| | | .le(Orders::getCreateTime, range.endDate)); |
| | | |
| | | List<OtherOrders> otherOrders = otherOrdersMapper.selectList(new QueryWrapper<OtherOrders>().lambda() |
| | | .eq(OtherOrders::getType, 2) |
| | | .eq(OtherOrders::getPayStatus, Constants.ONE) |
| | | .eq(OtherOrders::getDeleted, Constants.ZERO) |
| | | .ge(OtherOrders::getPayTime, startDate)); |
| | | // æ ¹æ®çéåºç订å䏻鮿¥è¯¢å·²æ¯ä»çé¾æè´¹ç¨ |
| | | List<Integer> orderIds = orders.stream().map(Orders::getId).collect(Collectors.toList()); |
| | | Map<Integer, Long> overduePaidMap = new HashMap<>(); |
| | | if (!orderIds.isEmpty()) { |
| | | List<OtherOrders> overdueOrders = otherOrdersMapper.selectList(new QueryWrapper<OtherOrders>().lambda() |
| | | .eq(OtherOrders::getType, 2) |
| | | .eq(OtherOrders::getPayStatus, Constants.ONE) |
| | | .eq(OtherOrders::getDeleted, Constants.ZERO) |
| | | .in(OtherOrders::getOrderId, orderIds)); |
| | | for (OtherOrders oo : overdueOrders) { |
| | | long amt = oo.getPayAccount() != null ? oo.getPayAccount() : 0L; |
| | | overduePaidMap.merge(oo.getOrderId(), amt, Long::sum); |
| | | } |
| | | } |
| | | |
| | | SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); |
| | | Map<String, Long> localOrderRevenue = new HashMap<>(); |
| | | Map<String, Long> remoteOrderRevenue = new HashMap<>(); |
| | | for (Orders o : orders) { |
| | | String date = sdf.format(o.getCreateTime()); |
| | | long pay = o.getPayAmount() != null ? o.getPayAmount() : 0L; |
| | | long refund = o.getRefundAmount() != null ? o.getRefundAmount() : 0L; |
| | | long overdue = (o.getOverdueStatus() != null && o.getOverdueStatus() == 2 && o.getOverdueAmount() != null) |
| | | ? o.getOverdueAmount() : 0L; |
| | | long overdue = overduePaidMap.getOrDefault(o.getId(), 0L); |
| | | long rev = pay - refund + overdue; |
| | | if (Constants.equalsInteger(o.getType(), Constants.ZERO)) { |
| | | localOrderRevenue.merge(date, rev, Long::sum); |
| | |
| | | } |
| | | } |
| | | |
| | | Map<String, Long> otherRevenueMap = new HashMap<>(); |
| | | for (OtherOrders oo : otherOrders) { |
| | | String date = sdf.format(oo.getPayTime()); |
| | | long amt = oo.getPayAccount() != null ? oo.getPayAccount() : 0L; |
| | | otherRevenueMap.merge(date, amt, Long::sum); |
| | | } |
| | | |
| | | return buildDailyList(startDate, (date) -> { |
| | | return buildTrendList(range, (date) -> { |
| | | RevenueTrendVO vo = new RevenueTrendVO(); |
| | | vo.setDate(date); |
| | | long local = localOrderRevenue.getOrDefault(date, 0L) + otherRevenueMap.getOrDefault(date, 0L); |
| | | long local = localOrderRevenue.getOrDefault(date, 0L); |
| | | long remote = remoteOrderRevenue.getOrDefault(date, 0L); |
| | | vo.setLocalRevenue(BigDecimal.valueOf(local).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP)); |
| | | vo.setRemoteRevenue(BigDecimal.valueOf(remote).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP)); |
| | |
| | | |
| | | @Override |
| | | public ShopPerformanceVO shopPerformance(DataBoardQueryDTO query) { |
| | | query.resolveDateRange(); |
| | | ShopPerformanceVO vo = new ShopPerformanceVO(); |
| | | |
| | | // 1. æ»è®¢åæ° + è¥æ¶ï¼status 1-6ï¼ |
| | |
| | | return vo; |
| | | } |
| | | |
| | | @Override |
| | | public List<LuggageTypeItem> luggageTypeList(DataBoardQueryDTO query) { |
| | | query.resolveDateRange(); |
| | | List<Orders> orders = ordersMapper.selectList(buildOrderQueryWrapper(query)); |
| | | List<Integer> orderIds = orders.stream().map(Orders::getId).collect(Collectors.toList()); |
| | | return buildLuggageTypeList(orderIds); |
| | | } |
| | | |
| | | @Override |
| | | public List<LuggageTypeItem> buildLuggageTypeList(List<Integer> orderIds) { |
| | | List<LuggageTypeItem> luggageTypeList = new ArrayList<>(); |
| | | if (orderIds != null && !orderIds.isEmpty()) { |
| | | List<OrdersDetail> details = ordersDetailMapper.selectList(new QueryWrapper<OrdersDetail>().lambda() |
| | | .in(OrdersDetail::getOrderId, orderIds) |
| | | .eq(OrdersDetail::getDeleted, Constants.ZERO)); |
| | | Map<String, List<OrdersDetail>> grouped = details.stream() |
| | | .filter(d -> StringUtils.isNotBlank(d.getLuggageName())) |
| | | .collect(Collectors.groupingBy(OrdersDetail::getLuggageName)); |
| | | for (Map.Entry<String, List<OrdersDetail>> entry : grouped.entrySet()) { |
| | | LuggageTypeItem item = new LuggageTypeItem(); |
| | | item.setLuggageName(entry.getKey()); |
| | | item.setOrderCount((long) entry.getValue().stream().map(OrdersDetail::getOrderId).distinct().count()); |
| | | item.setLuggageCount((long) entry.getValue().stream() |
| | | .mapToInt(d -> d.getNum() != null ? d.getNum() : 0).sum()); |
| | | luggageTypeList.add(item); |
| | | } |
| | | } |
| | | return luggageTypeList; |
| | | } |
| | | |
| | | @Override |
| | | public List<FinanceOverviewVO> financeOverview(FinanceQueryDTO query) { |
| | | // è¡¥é½æ¥æï¼startDate åæåï¼endDate åææ« |
| | | Calendar startCal = Calendar.getInstance(); |
| | | startCal.setTime(query.getStartDate()); |
| | | startCal.set(Calendar.DAY_OF_MONTH, 1); |
| | | startCal.set(Calendar.HOUR_OF_DAY, 0); |
| | | startCal.set(Calendar.MINUTE, 0); |
| | | startCal.set(Calendar.SECOND, 0); |
| | | startCal.set(Calendar.MILLISECOND, 0); |
| | | query.setStartDate(startCal.getTime()); |
| | | |
| | | Calendar endCal = Calendar.getInstance(); |
| | | endCal.setTime(query.getEndDate()); |
| | | endCal.set(Calendar.DAY_OF_MONTH, endCal.getActualMaximum(Calendar.DAY_OF_MONTH)); |
| | | endCal.set(Calendar.HOUR_OF_DAY, 23); |
| | | endCal.set(Calendar.MINUTE, 59); |
| | | endCal.set(Calendar.SECOND, 59); |
| | | endCal.set(Calendar.MILLISECOND, 999); |
| | | query.setEndDate(endCal.getTime()); |
| | | |
| | | List<Orders> orders = ordersMapper.selectList(buildFinanceOrderQueryWrapper(query)); |
| | | |
| | | // æ ¹æ®çéåºç订å䏻鮿¥è¯¢å·²æ¯ä»çé¾æè´¹ç¨ |
| | | List<Integer> orderIds = orders.stream().map(Orders::getId).collect(Collectors.toList()); |
| | | Map<Integer, Long> overduePaidMap = new HashMap<>(); |
| | | if (!orderIds.isEmpty()) { |
| | | List<OtherOrders> overdueOrders = otherOrdersMapper.selectList(new QueryWrapper<OtherOrders>().lambda() |
| | | .eq(OtherOrders::getType, 2) |
| | | .eq(OtherOrders::getPayStatus, Constants.ONE) |
| | | .eq(OtherOrders::getDeleted, Constants.ZERO) |
| | | .in(OtherOrders::getOrderId, orderIds)); |
| | | for (OtherOrders oo : overdueOrders) { |
| | | long amt = oo.getPayAccount() != null ? oo.getPayAccount() : 0L; |
| | | overduePaidMap.merge(oo.getOrderId(), amt, Long::sum); |
| | | } |
| | | } |
| | | |
| | | SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM"); |
| | | Map<String, List<Orders>> grouped = orders.stream() |
| | | .collect(Collectors.groupingBy(o -> sdf.format(o.getCreateTime()))); |
| | | |
| | | // çæå®æ´å¹´æå表 |
| | | List<String> months = new ArrayList<>(); |
| | | Calendar loop = Calendar.getInstance(); |
| | | loop.setTime(query.getStartDate()); |
| | | loop.set(Calendar.DAY_OF_MONTH, 1); |
| | | Calendar monthEnd = Calendar.getInstance(); |
| | | monthEnd.setTime(query.getEndDate()); |
| | | while (!loop.after(monthEnd)) { |
| | | months.add(sdf.format(loop.getTime())); |
| | | loop.add(Calendar.MONTH, 1); |
| | | } |
| | | |
| | | BigDecimal hundred = BigDecimal.valueOf(100); |
| | | List<FinanceOverviewVO> result = new ArrayList<>(); |
| | | for (String month : months) { |
| | | List<Orders> monthOrders = grouped.getOrDefault(month, Collections.emptyList()); |
| | | long storageRev = 0L, deliveryRev = 0L, shopFee = 0L, driverFeeTotal = 0L, refundTotal = 0L, overdueTotal = 0L; |
| | | for (Orders o : monthOrders) { |
| | | long pay = o.getPayAmount() != null ? o.getPayAmount() : 0L; |
| | | long refund = o.getRefundAmount() != null ? o.getRefundAmount() : 0L; |
| | | long overdue = overduePaidMap.getOrDefault(o.getId(), 0L); |
| | | long actual = pay - refund + overdue; |
| | | long depFee = o.getDepositShopFee() != null ? o.getDepositShopFee() : 0L; |
| | | long takeFee = o.getTakeShopFee() != null ? o.getTakeShopFee() : 0L; |
| | | long dFee = Constants.equalsInteger(o.getType(),Constants.ONE)&&o.getDriverFee() != null ? o.getDriverFee() : 0L; |
| | | if (Constants.equalsInteger(o.getType(), Constants.ZERO)) { |
| | | storageRev += actual; |
| | | shopFee += depFee; |
| | | } else { |
| | | deliveryRev += actual; |
| | | shopFee += depFee + takeFee; |
| | | } |
| | | driverFeeTotal += dFee; |
| | | refundTotal += refund; |
| | | overdueTotal += overdue; |
| | | } |
| | | long totalRev = storageRev + deliveryRev; |
| | | long netRev = totalRev - shopFee - driverFeeTotal; |
| | | |
| | | FinanceOverviewVO vo = new FinanceOverviewVO(); |
| | | vo.setDate(month); |
| | | vo.setStorageRevenue(BigDecimal.valueOf(storageRev).divide(hundred, 2, RoundingMode.HALF_UP)); |
| | | vo.setDeliveryRevenue(BigDecimal.valueOf(deliveryRev).divide(hundred, 2, RoundingMode.HALF_UP)); |
| | | vo.setTotalRevenue(BigDecimal.valueOf(totalRev).divide(hundred, 2, RoundingMode.HALF_UP)); |
| | | vo.setShopFeeTotal(BigDecimal.valueOf(shopFee).divide(hundred, 2, RoundingMode.HALF_UP)); |
| | | vo.setDriverFeeTotal(BigDecimal.valueOf(driverFeeTotal).divide(hundred, 2, RoundingMode.HALF_UP)); |
| | | vo.setRefundAmount(BigDecimal.valueOf(refundTotal).divide(hundred, 2, RoundingMode.HALF_UP)); |
| | | vo.setOverdueAmount(BigDecimal.valueOf(overdueTotal).divide(hundred, 2, RoundingMode.HALF_UP)); |
| | | vo.setNetRevenue(BigDecimal.valueOf(netRev).divide(hundred, 2, RoundingMode.HALF_UP)); |
| | | result.add(vo); |
| | | } |
| | | return result; |
| | | } |
| | | |
| | | @Override |
| | | public List<ShopTopVO> shopTop(TrendQueryDTO query) { |
| | | TrendDateRange range = parseTrendDateRange(query); |
| | | List<Orders> orders = ordersMapper.selectList(new QueryWrapper<Orders>().lambda() |
| | | .eq(Orders::getDeleted, Constants.ZERO) |
| | | .eq(Orders::getStatus, Constants.OrderStatus.finished.getKey()) |
| | | .ge(Orders::getCreateTime, range.startDate) |
| | | .le(Orders::getCreateTime, range.endDate)); |
| | | |
| | | // æ ¹æ®çéåºç订å䏻鮿¥è¯¢å·²æ¯ä»çé¾æè´¹ç¨ |
| | | List<Integer> orderIds = orders.stream().map(Orders::getId).collect(Collectors.toList()); |
| | | Map<Integer, Long> overduePaidMap = new HashMap<>(); |
| | | if (!orderIds.isEmpty()) { |
| | | List<OtherOrders> overdueOrders = otherOrdersMapper.selectList(new QueryWrapper<OtherOrders>().lambda() |
| | | .eq(OtherOrders::getType, 2) |
| | | .eq(OtherOrders::getPayStatus, Constants.ONE) |
| | | .eq(OtherOrders::getDeleted, Constants.ZERO) |
| | | .in(OtherOrders::getOrderId, orderIds)); |
| | | for (OtherOrders oo : overdueOrders) { |
| | | long amt = oo.getPayAccount() != null ? oo.getPayAccount() : 0L; |
| | | overduePaidMap.merge(oo.getOrderId(), amt, Long::sum); |
| | | } |
| | | } |
| | | |
| | | // æé¨åºIDå½é: key = shopId |
| | | Map<Integer, long[]> map = new LinkedHashMap<>(); |
| | | for (Orders o : orders) { |
| | | long pay = o.getPayAmount() != null ? o.getPayAmount() : 0L; |
| | | long refund = o.getRefundAmount() != null ? o.getRefundAmount() : 0L; |
| | | long overdue = overduePaidMap.getOrDefault(o.getId(), 0L); |
| | | boolean hasRefund = refund > 0; |
| | | long rev = pay - refund + overdue; |
| | | |
| | | // åä»¶é¨åº |
| | | if (o.getDepositShopId() != null) { |
| | | long depFee = o.getDepositShopFee() != null ? o.getDepositShopFee() : 0L; |
| | | long[] arr = map.computeIfAbsent(o.getDepositShopId(), k -> new long[4]); // [count, revenue, fee, refundCount] |
| | | arr[0]++; |
| | | arr[1] += rev; |
| | | arr[2] += depFee; |
| | | if (hasRefund) arr[3]++; |
| | | } |
| | | // å¼å°ä¸æåä»¶é¨åº |
| | | if (Constants.equalsInteger(o.getType(), Constants.ONE) && o.getTakeShopId() != null) { |
| | | long takeFee = o.getTakeShopFee() != null ? o.getTakeShopFee() : 0L; |
| | | long[] arr = map.computeIfAbsent(o.getTakeShopId(), k -> new long[4]); |
| | | arr[0]++; |
| | | arr[1] += rev; |
| | | arr[2] += takeFee; |
| | | if (hasRefund) arr[3]++; |
| | | } |
| | | } |
| | | |
| | | // æ¹éæ¥é¨åºåç§° |
| | | Set<Integer> shopIds = map.keySet(); |
| | | Map<Integer, String> shopNameMap = new HashMap<>(); |
| | | if (!shopIds.isEmpty()) { |
| | | List<ShopInfo> shops = shopInfoMapper.selectList(new QueryWrapper<ShopInfo>().lambda() |
| | | .in(ShopInfo::getId, shopIds) |
| | | .select(ShopInfo::getId, ShopInfo::getName)); |
| | | for (ShopInfo s : shops) { |
| | | shopNameMap.put(s.getId(), s.getName()); |
| | | } |
| | | } |
| | | |
| | | BigDecimal hundred = BigDecimal.valueOf(100); |
| | | List<ShopTopVO> result = new ArrayList<>(); |
| | | for (Map.Entry<Integer, long[]> entry : map.entrySet()) { |
| | | long[] arr = entry.getValue(); |
| | | ShopTopVO vo = new ShopTopVO(); |
| | | vo.setShopId(entry.getKey()); |
| | | vo.setShopName(shopNameMap.getOrDefault(entry.getKey(), "")); |
| | | vo.setCompletedCount(arr[0]); |
| | | vo.setTotalRevenue(BigDecimal.valueOf(arr[1]).divide(hundred, 2, RoundingMode.HALF_UP)); |
| | | vo.setShopFeeTotal(BigDecimal.valueOf(arr[2]).divide(hundred, 2, RoundingMode.HALF_UP)); |
| | | vo.setRefundCount(arr[3]); |
| | | vo.setPenaltyAmount(BigDecimal.ZERO); |
| | | result.add(vo); |
| | | } |
| | | result.sort((a, b) -> Long.compare(b.getCompletedCount(), a.getCompletedCount())); |
| | | return result.size() > 10 ? result.subList(0, 10) : result; |
| | | } |
| | | |
| | | @Override |
| | | public List<DriverTopVO> driverTop(TrendQueryDTO query) { |
| | | TrendDateRange range = parseTrendDateRange(query); |
| | | List<Orders> orders = ordersMapper.selectList(new QueryWrapper<Orders>().lambda() |
| | | // .eq(Orders::getDeleted, Constants.ZERO) |
| | | .in(Orders::getStatus, |
| | | Constants.OrderStatus.waitDeposit.getKey(), |
| | | Constants.OrderStatus.deposited.getKey(), |
| | | Constants.OrderStatus.accepted.getKey(), |
| | | Constants.OrderStatus.delivering.getKey(), |
| | | Constants.OrderStatus.arrived.getKey(), |
| | | Constants.OrderStatus.finished.getKey()) |
| | | .eq(Orders::getType, Constants.ONE) |
| | | .ge(Orders::getCreateTime, range.startDate) |
| | | .le(Orders::getCreateTime, range.endDate)); |
| | | |
| | | System.out.println( |
| | | orders.stream().map(i->i.getDriverFee()).reduce(0L,Long::sum) |
| | | ); |
| | | |
| | | // æ ¹æ®çéåºç订å䏻鮿¥è¯¢å·²æ¯ä»çé¾æè´¹ç¨ |
| | | List<Integer> orderIds = orders.stream().map(Orders::getId).collect(Collectors.toList()); |
| | | Map<Integer, Long> overduePaidMap = new HashMap<>(); |
| | | if (!orderIds.isEmpty()) { |
| | | List<OtherOrders> overdueOrders = otherOrdersMapper.selectList(new QueryWrapper<OtherOrders>().lambda() |
| | | .eq(OtherOrders::getType, 2) |
| | | .eq(OtherOrders::getPayStatus, Constants.ONE) |
| | | .eq(OtherOrders::getDeleted, Constants.ZERO) |
| | | .in(OtherOrders::getOrderId, orderIds)); |
| | | for (OtherOrders oo : overdueOrders) { |
| | | long amt = oo.getPayAccount() != null ? oo.getPayAccount() : 0L; |
| | | overduePaidMap.merge(oo.getOrderId(), amt, Long::sum); |
| | | } |
| | | } |
| | | |
| | | // æå¸æºå½é: key = acceptDriver |
| | | Map<Integer, long[]> map = new LinkedHashMap<>(); |
| | | for (Orders o : orders) { |
| | | if (o.getAcceptDriver() == null) continue; |
| | | long pay = o.getPayAmount() != null ? o.getPayAmount() : 0L; |
| | | long refund = o.getRefundAmount() != null ? o.getRefundAmount() : 0L; |
| | | long overdue = overduePaidMap.getOrDefault(o.getId(), 0L); |
| | | long dFee = o.getDriverFee() != null ? o.getDriverFee() : 0L; |
| | | long[] arr = map.computeIfAbsent(o.getAcceptDriver(), k -> new long[4]); // [count, revenue, fee, refundCount] |
| | | arr[0]++; |
| | | arr[1] += pay - refund + overdue; |
| | | arr[2] += dFee; |
| | | if (refund > 0) arr[3]++; |
| | | } |
| | | |
| | | // æ¹éæ¥å¸æºå§å |
| | | Set<Integer> driverIds = map.keySet(); |
| | | Map<Integer, String> driverNameMap = new HashMap<>(); |
| | | if (!driverIds.isEmpty()) { |
| | | List<DriverInfo> drivers = driverInfoMapper.selectList(new QueryWrapper<DriverInfo>().lambda() |
| | | .in(DriverInfo::getId, driverIds) |
| | | .select(DriverInfo::getMemberId, DriverInfo::getName)); |
| | | for (DriverInfo d : drivers) { |
| | | driverNameMap.put(d.getMemberId(), d.getName()); |
| | | } |
| | | } |
| | | |
| | | BigDecimal hundred = BigDecimal.valueOf(100); |
| | | List<DriverTopVO> result = new ArrayList<>(); |
| | | for (Map.Entry<Integer, long[]> entry : map.entrySet()) { |
| | | long[] arr = entry.getValue(); |
| | | DriverTopVO vo = new DriverTopVO(); |
| | | vo.setDriverId(entry.getKey()); |
| | | vo.setDriverName(driverNameMap.getOrDefault(entry.getKey(), "æªç¥")); |
| | | vo.setCompletedCount(arr[0]); |
| | | vo.setTotalRevenue(BigDecimal.valueOf(arr[1]).divide(hundred, 2, RoundingMode.HALF_UP)); |
| | | vo.setDriverFeeTotal(BigDecimal.valueOf(arr[2]).divide(hundred, 2, RoundingMode.HALF_UP)); |
| | | vo.setRefundCount(arr[3]); |
| | | vo.setPenaltyAmount(BigDecimal.ZERO); |
| | | result.add(vo); |
| | | } |
| | | result.sort((a, b) -> Long.compare(b.getCompletedCount(), a.getCompletedCount())); |
| | | return result.size() > 10 ? result.subList(0, 10) : result; |
| | | } |
| | | |
| | | // ========== ç§ææ¹æ³ ========== |
| | | |
| | | private QueryWrapper<Orders> buildOrderQueryWrapper(DataBoardQueryDTO query) { |
| | |
| | | Constants.OrderStatus.accepted.getKey(), |
| | | Constants.OrderStatus.delivering.getKey(), |
| | | Constants.OrderStatus.arrived.getKey(), |
| | | Constants.OrderStatus.overdue.getKey()); |
| | | Constants.OrderStatus.finished.getKey()); |
| | | if (query.getStartDate() != null) { |
| | | qw.lambda().ge(Orders::getCreateTime, query.getStartDate()); |
| | | } |
| | |
| | | return qw; |
| | | } |
| | | |
| | | private Date get30DaysAgoStart() { |
| | | Calendar cal = Calendar.getInstance(); |
| | | cal.set(Calendar.HOUR_OF_DAY, 0); |
| | | cal.set(Calendar.MINUTE, 0); |
| | | cal.set(Calendar.SECOND, 0); |
| | | cal.set(Calendar.MILLISECOND, 0); |
| | | cal.add(Calendar.DAY_OF_MONTH, -29); |
| | | return cal.getTime(); |
| | | private QueryWrapper<Orders> buildFinanceOrderQueryWrapper(FinanceQueryDTO query) { |
| | | QueryWrapper<Orders> qw = new QueryWrapper<>(); |
| | | qw.lambda() |
| | | .eq(Orders::getDeleted, Constants.ZERO) |
| | | .in(Orders::getStatus, |
| | | Constants.OrderStatus.waitDeposit.getKey(), |
| | | Constants.OrderStatus.deposited.getKey(), |
| | | Constants.OrderStatus.accepted.getKey(), |
| | | Constants.OrderStatus.delivering.getKey(), |
| | | Constants.OrderStatus.arrived.getKey(), |
| | | Constants.OrderStatus.finished.getKey()); |
| | | if (query.getStartDate() != null) { |
| | | qw.lambda().ge(Orders::getCreateTime, query.getStartDate()); |
| | | } |
| | | if (query.getEndDate() != null) { |
| | | qw.lambda().le(Orders::getCreateTime, Utils.Date.getEnd(query.getEndDate())); |
| | | } |
| | | return qw; |
| | | } |
| | | |
| | | private TrendDateRange parseTrendDateRange(TrendQueryDTO query) { |
| | | Calendar now = Calendar.getInstance(); |
| | | TrendDateRange range = new TrendDateRange(); |
| | | |
| | | if (StringUtils.isNotBlank(query.getMonth())) { |
| | | // æææ¥è¯¢ï¼yyyy-MM |
| | | SimpleDateFormat parseSdf = new SimpleDateFormat("yyyy-MM"); |
| | | Date monthDate; |
| | | try { |
| | | monthDate = parseSdf.parse(query.getMonth()); |
| | | } catch (Exception e) { |
| | | throw new IllegalArgumentException("month æ ¼å¼é误ï¼åºä¸º yyyy-MM"); |
| | | } |
| | | Calendar monthCal = Calendar.getInstance(); |
| | | monthCal.setTime(monthDate); |
| | | |
| | | // 彿1æ¥èµ·å§ |
| | | monthCal.set(Calendar.DAY_OF_MONTH, 1); |
| | | monthCal.set(Calendar.HOUR_OF_DAY, 0); |
| | | monthCal.set(Calendar.MINUTE, 0); |
| | | monthCal.set(Calendar.SECOND, 0); |
| | | monthCal.set(Calendar.MILLISECOND, 0); |
| | | range.startDate = monthCal.getTime(); |
| | | |
| | | // ææ« |
| | | monthCal.set(Calendar.DAY_OF_MONTH, monthCal.getActualMaximum(Calendar.DAY_OF_MONTH)); |
| | | monthCal.set(Calendar.HOUR_OF_DAY, 23); |
| | | monthCal.set(Calendar.MINUTE, 59); |
| | | monthCal.set(Calendar.SECOND, 59); |
| | | monthCal.set(Calendar.MILLISECOND, 999); |
| | | Date monthEnd = monthCal.getTime(); |
| | | |
| | | // ä¸è½è¶
è¿å½åæ¶é´ |
| | | range.endDate = monthEnd.after(now.getTime()) ? now.getTime() : monthEnd; |
| | | range.byMonth = true; |
| | | range.pattern = "MM-dd"; |
| | | } else if (StringUtils.isNotBlank(query.getYear())) { |
| | | // æå¹´æ¥è¯¢ï¼yyyy |
| | | int year = Integer.parseInt(query.getYear()); |
| | | Calendar yearStart = Calendar.getInstance(); |
| | | yearStart.set(Calendar.YEAR, year); |
| | | yearStart.set(Calendar.MONTH, Calendar.JANUARY); |
| | | yearStart.set(Calendar.DAY_OF_MONTH, 1); |
| | | yearStart.set(Calendar.HOUR_OF_DAY, 0); |
| | | yearStart.set(Calendar.MINUTE, 0); |
| | | yearStart.set(Calendar.SECOND, 0); |
| | | yearStart.set(Calendar.MILLISECOND, 0); |
| | | range.startDate = yearStart.getTime(); |
| | | |
| | | Calendar yearEnd = Calendar.getInstance(); |
| | | yearEnd.set(Calendar.YEAR, year); |
| | | yearEnd.set(Calendar.MONTH, Calendar.DECEMBER); |
| | | yearEnd.set(Calendar.DAY_OF_MONTH, 31); |
| | | yearEnd.set(Calendar.HOUR_OF_DAY, 23); |
| | | yearEnd.set(Calendar.MINUTE, 59); |
| | | yearEnd.set(Calendar.SECOND, 59); |
| | | yearEnd.set(Calendar.MILLISECOND, 999); |
| | | Date end = yearEnd.getTime(); |
| | | range.endDate = end.after(now.getTime()) ? now.getTime() : end; |
| | | range.byMonth = false; |
| | | range.pattern = "MM"; |
| | | } else { |
| | | throw new IllegalArgumentException("è¯·ä¼ å
¥ month æ year åæ°"); |
| | | } |
| | | return range; |
| | | } |
| | | |
| | | private static class TrendDateRange { |
| | | Date startDate; |
| | | Date endDate; |
| | | boolean byMonth; // true=æææ¥(ææ¥è¿å)ï¼false=æå¹´æ¥(ææè¿å) |
| | | String pattern; // SimpleDateFormat æ ¼å¼ |
| | | } |
| | | |
| | | @FunctionalInterface |
| | | private interface DailyVOBuilder<T> { |
| | | private interface TrendVOBuilder<T> { |
| | | T build(String date); |
| | | } |
| | | |
| | | private <T> List<T> buildDailyList(Date startDate, DailyVOBuilder<T> builder) { |
| | | SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); |
| | | private <T> List<T> buildTrendList(TrendDateRange range, TrendVOBuilder<T> builder) { |
| | | List<T> result = new ArrayList<>(); |
| | | Calendar loop = Calendar.getInstance(); |
| | | loop.setTime(startDate); |
| | | Calendar end = Calendar.getInstance(); |
| | | while (!loop.after(end)) { |
| | | result.add(builder.build(sdf.format(loop.getTime()))); |
| | | loop.add(Calendar.DAY_OF_MONTH, 1); |
| | | SimpleDateFormat sdf = new SimpleDateFormat(range.pattern); |
| | | |
| | | if (range.byMonth) { |
| | | // ææ¥å¾ªç¯ |
| | | Calendar loop = Calendar.getInstance(); |
| | | loop.setTime(range.startDate); |
| | | Calendar end = Calendar.getInstance(); |
| | | end.setTime(range.endDate); |
| | | while (!loop.after(end)) { |
| | | result.add(builder.build(sdf.format(loop.getTime()))); |
| | | loop.add(Calendar.DAY_OF_MONTH, 1); |
| | | } |
| | | } else { |
| | | // ææå¾ªç¯ 1~12ï¼ä¸è½è¶
è¿ endDate æå¨æ |
| | | Calendar endCal = Calendar.getInstance(); |
| | | endCal.setTime(range.endDate); |
| | | int endMonth = endCal.get(Calendar.MONTH); // 0-based |
| | | for (int m = 0; m <= endMonth; m++) { |
| | | String label = String.format("%02d", m + 1); |
| | | result.add(builder.build(label)); |
| | | } |
| | | } |
| | | return result; |
| | | } |
| | |
| | | * åé叿ºç«å
ä¿¡éç¥ |
| | | */ |
| | | private void sendDriverNotice(Integer driverId, Constants.DriverOrderNotify notify, Integer orderId, String... params) { |
| | | sendDriverNotice(driverId, notify, orderId, 0, params); |
| | | } |
| | | |
| | | private void sendDriverNotice(Integer driverId, Constants.DriverOrderNotify notify, Integer objId, Integer objType, String... params) { |
| | | DriverInfo driver = driverInfoMapper.selectById(driverId); |
| | | if (driver == null || driver.getMemberId() == null) { |
| | | return; |
| | |
| | | notice.setUserId(driver.getMemberId()); |
| | | notice.setTitle(notify.getTitle()); |
| | | notice.setContent(notify.format(params)); |
| | | notice.setObjId(orderId); |
| | | notice.setObjType(0); // 0=订å |
| | | notice.setObjId(objId); |
| | | notice.setObjType(objType); |
| | | notice.setStatus(0); // 0=æªè¯» |
| | | notice.setIsdeleted(Constants.ZERO); |
| | | notice.setCreateDate(new Date()); |
| | |
| | | newChange.setJpushAlias(official.getJpushAlias()); |
| | | driverInfoMapper.insert(newChange); |
| | | saveDriverAttachments(newChange.getId(), request, now); |
| | | // æ è®°åå²çåæ´çæ¬ä¸ºå é¤ |
| | | |
| | | |
| | | |
| | | } else { |
| | | // auditStatus=0/2ï¼ç´æ¥æ´æ°åæ´çæ¬ |
| | | applyDriverFieldsFromUpdate(changeVersion.getId(), request, now); |
| | |
| | | |
| | | // çä¿¡éç¥ |
| | | sendDriverAuditSms(changeVersion, newAuditStatus, auditDTO.getAuditRemark()); |
| | | |
| | | // 馿¬¡å®¡æ¹éè¿ï¼åéå¥å±è§£éç«å
ä¿¡ |
| | | if (Constants.equalsInteger(newAuditStatus, Constants.THREE)) { |
| | | sendDriverNotice(changeVersion.getId(), Constants.DriverOrderNotify.REWARD_UNLOCKED, null, 2); |
| | | } |
| | | } else { |
| | | // åºæ¯2ï¼æ£å¼çæ¬å·²å®¡æ¹éè¿ï¼åæ´å®¡æ¹ï¼ |
| | | if (Constants.equalsInteger(newAuditStatus, Constants.THREE)) { |
| | |
| | | // 4. æ´æ°è®¢åç¶æä¸ºæ´¾éä¸(4) |
| | | ordersMapper.update(new UpdateWrapper<Orders>().lambda() |
| | | .set(Orders::getStatus, Constants.OrderStatus.delivering.getStatus()) |
| | | .set(Orders::getTakeTime, now) |
| | | .set(Orders::getDriverTakeTime, now) |
| | | .set(Orders::getUpdateTime, now) |
| | | .eq(Orders::getId, orderId)); |
| | | |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.doumee.service.business.impl; |
| | | |
| | | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
| | | import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; |
| | | import com.baomidou.mybatisplus.core.metadata.IPage; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.doumee.core.constants.Constants; |
| | | import com.doumee.core.constants.ResponseStatus; |
| | | import com.doumee.core.exception.BusinessException; |
| | | import com.doumee.core.model.LoginUserInfo; |
| | | import com.doumee.core.model.PageData; |
| | | import com.doumee.core.model.PageWrap; |
| | | import com.doumee.biz.system.SystemDictDataBiz; |
| | | import com.doumee.core.utils.FtpUtil; |
| | | import com.doumee.core.utils.Utils; |
| | | import com.doumee.dao.business.InvoiceRecordMapper; |
| | | import com.doumee.dao.business.OrdersMapper; |
| | | import com.doumee.dao.business.model.InvoiceRecord; |
| | | import com.doumee.dao.business.model.Orders; |
| | | import com.doumee.dao.dto.ApplyInvoiceDTO; |
| | | import com.doumee.dao.vo.InvoiceRecordSummaryVO; |
| | | import com.doumee.service.business.InvoiceRecordService; |
| | | import com.doumee.service.common.EmailService; |
| | | import org.apache.commons.lang3.StringUtils; |
| | | import org.apache.commons.lang3.StringUtils; |
| | | import org.apache.shiro.SecurityUtils; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.util.CollectionUtils; |
| | | |
| | | import java.io.File; |
| | | import java.io.FileOutputStream; |
| | | import java.util.*; |
| | | |
| | | |
| | | /** |
| | | * å票ç³è¯·è®°å½Serviceå®ç° |
| | | * |
| | | * @author rk |
| | | * @date 2026/05/18 |
| | | */ |
| | | @Service |
| | | public class InvoiceRecordServiceImpl implements InvoiceRecordService { |
| | | |
| | | @Autowired |
| | | private InvoiceRecordMapper invoiceRecordMapper; |
| | | |
| | | @Autowired |
| | | private OrdersMapper ordersMapper; |
| | | |
| | | @Autowired |
| | | private EmailService emailService; |
| | | |
| | | @Autowired |
| | | private SystemDictDataBiz systemDictDataBiz; |
| | | |
| | | @Override |
| | | public Integer create(InvoiceRecord invoiceRecord) { |
| | | LoginUserInfo loginUserInfo = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal(); |
| | | invoiceRecord.setDeleted(Constants.ZERO); |
| | | invoiceRecord.setCreateTime(new Date()); |
| | | invoiceRecord.setCreateUser(loginUserInfo.getId()); |
| | | invoiceRecord.setUpdateTime(new Date()); |
| | | invoiceRecord.setUpdateUser(loginUserInfo.getId()); |
| | | invoiceRecordMapper.insert(invoiceRecord); |
| | | return invoiceRecord.getId(); |
| | | } |
| | | |
| | | @Override |
| | | public void deleteById(Integer id) { |
| | | invoiceRecordMapper.update(new UpdateWrapper<InvoiceRecord>().lambda() |
| | | .set(InvoiceRecord::getDeleted, Constants.ONE) |
| | | .eq(InvoiceRecord::getId, id)); |
| | | } |
| | | |
| | | @Override |
| | | public void delete(InvoiceRecord invoiceRecord) { |
| | | UpdateWrapper<InvoiceRecord> deleteWrapper = new UpdateWrapper<>(invoiceRecord); |
| | | invoiceRecordMapper.delete(deleteWrapper); |
| | | } |
| | | |
| | | @Override |
| | | public void deleteByIdInBatch(List<Integer> ids) { |
| | | if (CollectionUtils.isEmpty(ids)) { |
| | | return; |
| | | } |
| | | for (Integer id : ids) { |
| | | this.deleteById(id); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public void updateById(InvoiceRecord invoiceRecord) { |
| | | LoginUserInfo loginUserInfo = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal(); |
| | | invoiceRecord.setUpdateTime(new Date()); |
| | | invoiceRecord.setUpdateUser(loginUserInfo.getId()); |
| | | invoiceRecordMapper.updateById(invoiceRecord); |
| | | } |
| | | |
| | | @Override |
| | | public void updateByIdInBatch(List<InvoiceRecord> invoiceRecords) { |
| | | if (CollectionUtils.isEmpty(invoiceRecords)) { |
| | | return; |
| | | } |
| | | for (InvoiceRecord invoiceRecord : invoiceRecords) { |
| | | this.updateById(invoiceRecord); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public InvoiceRecord findById(Integer id) { |
| | | InvoiceRecord invoiceRecord = invoiceRecordMapper.selectById(id); |
| | | if (Objects.isNull(invoiceRecord)) { |
| | | throw new BusinessException(ResponseStatus.DATA_EMPTY); |
| | | } |
| | | return invoiceRecord; |
| | | } |
| | | |
| | | @Override |
| | | public InvoiceRecord findOne(InvoiceRecord invoiceRecord) { |
| | | QueryWrapper<InvoiceRecord> wrapper = new QueryWrapper<>(invoiceRecord); |
| | | return invoiceRecordMapper.selectOne(wrapper); |
| | | } |
| | | |
| | | @Override |
| | | public List<InvoiceRecord> findList(InvoiceRecord invoiceRecord) { |
| | | QueryWrapper<InvoiceRecord> wrapper = new QueryWrapper<>(invoiceRecord); |
| | | return invoiceRecordMapper.selectList(wrapper); |
| | | } |
| | | |
| | | @Override |
| | | public PageData<InvoiceRecord> findPage(PageWrap<InvoiceRecord> pageWrap) { |
| | | IPage<InvoiceRecord> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity()); |
| | | QueryWrapper<InvoiceRecord> qw = buildAdminQueryWrapper(pageWrap.getModel()); |
| | | qw.lambda().orderByDesc(InvoiceRecord::getCreateTime); |
| | | return PageData.from(invoiceRecordMapper.selectPage(page, qw)); |
| | | } |
| | | |
| | | @Override |
| | | public long count(InvoiceRecord invoiceRecord) { |
| | | QueryWrapper<InvoiceRecord> wrapper = new QueryWrapper<>(invoiceRecord); |
| | | return invoiceRecordMapper.selectCount(wrapper); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = {Exception.class, BusinessException.class}) |
| | | public void applyInvoice(ApplyInvoiceDTO dto, Integer memberId) { |
| | | // æ¥è¯¢è®¢å |
| | | Orders order = ordersMapper.selectById(dto.getOrderId()); |
| | | if (order == null || Constants.equalsInteger(order.getDeleted(), Constants.ONE)) { |
| | | throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "订åä¸åå¨"); |
| | | } |
| | | if (!Constants.equalsInteger(order.getMemberId(), memberId)) { |
| | | throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "æ ææä½è¯¥è®¢å"); |
| | | } |
| | | |
| | | // æ ¡éªåç¥¨ç¶æï¼åªæ1=å¯ç³è¯·ã99=å¼å
·å¤±è´¥å¯ä»¥ç³è¯· |
| | | if (order.getInvoiceStatus() == null |
| | | || (!Constants.equalsInteger(order.getInvoiceStatus(), Constants.ONE) |
| | | && !Constants.equalsInteger(order.getInvoiceStatus(), 99))) { |
| | | throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "å½å订å䏿¯æå¼ç¥¨ç³è¯·"); |
| | | } |
| | | |
| | | // 个人/äºä¸åä½åªè½å¼å
·çµåæ®éå票 |
| | | if (Constants.equalsInteger(dto.getOrgType(), Constants.ZERO) |
| | | && !Constants.equalsInteger(dto.getInvoiceType(), Constants.ZERO)) { |
| | | throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "个人/äºä¸åä½åªè½å¼å
·çµåæ®éå票"); |
| | | } |
| | | |
| | | // ä¼ä¸ç±»åï¼ç¨å·å¿
å¡« |
| | | if (Constants.equalsInteger(dto.getOrgType(), Constants.ONE) |
| | | && StringUtils.isBlank(dto.getTaxId())) { |
| | | throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "ä¼ä¸ç±»åç¨å·ä¸è½ä¸ºç©º"); |
| | | } |
| | | |
| | | // çµåä¸ç¨å票ï¼å¼æ·é¶è¡ãé¶è¡è´¦å·ãä¼ä¸å°åãä¼ä¸çµè¯å¿
å¡« |
| | | if (Constants.equalsInteger(dto.getInvoiceType(), Constants.ONE)) { |
| | | if (StringUtils.isAnyBlank(dto.getBankName(), dto.getBankAccount(), |
| | | dto.getCompanyAddr(), dto.getCompanyPhone())) { |
| | | throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "çµåä¸ç¨å票éå¡«å弿·é¶è¡ãé¶è¡è´¦å·ãä¼ä¸å°åãä¼ä¸çµè¯"); |
| | | } |
| | | } |
| | | |
| | | // 计ç®å¼ç¥¨éé¢ |
| | | long payAmount = order.getPayAmount() != null ? order.getPayAmount() : 0L; |
| | | long refundAmount = order.getRefundAmount() != null ? order.getRefundAmount() : 0L; |
| | | long invoiceAmount = payAmount - refundAmount; |
| | | |
| | | // å建å票ç³è¯·è®°å½ |
| | | InvoiceRecord record = new InvoiceRecord(); |
| | | record.setOrderId(order.getId()); |
| | | record.setOrderNo(order.getCode()); |
| | | record.setMemberId(memberId); |
| | | record.setOrgType(dto.getOrgType()); |
| | | record.setInvoiceType(dto.getInvoiceType()); |
| | | record.setName(dto.getName()); |
| | | record.setTaxId(dto.getTaxId()); |
| | | record.setBankName(dto.getBankName()); |
| | | record.setBankAccount(dto.getBankAccount()); |
| | | record.setCompanyAddr(dto.getCompanyAddr()); |
| | | record.setCompanyPhone(dto.getCompanyPhone()); |
| | | record.setInvoiceAmount(invoiceAmount); |
| | | record.setStatus(Constants.ZERO); // 0=ç³è¯·ä¸ |
| | | record.setDeleted(Constants.ZERO); |
| | | record.setCreateTime(new Date()); |
| | | invoiceRecordMapper.insert(record); |
| | | |
| | | // æ´æ°è®¢ååç¥¨ç¶æä¸ºç³è¯·ä¸ |
| | | order.setInvoiceStatus(Constants.TWO); |
| | | order.setUpdateTime(new Date()); |
| | | ordersMapper.updateById(order); |
| | | } |
| | | |
| | | @Override |
| | | public PageData<InvoiceRecord> findMemberInvoicePage(PageWrap<InvoiceRecord> pageWrap, Integer memberId) { |
| | | IPage<InvoiceRecord> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity()); |
| | | QueryWrapper<InvoiceRecord> qw = new QueryWrapper<>(); |
| | | qw.lambda() |
| | | .eq(InvoiceRecord::getDeleted, Constants.ZERO) |
| | | .eq(InvoiceRecord::getMemberId, memberId) |
| | | // .eq(InvoiceRecord::getStatus, Constants.ONE) // åªæ¥å·²å¼å
·æå |
| | | .orderByDesc(InvoiceRecord::getCreateTime); |
| | | return PageData.from(invoiceRecordMapper.selectPage(page, qw)); |
| | | } |
| | | |
| | | @Override |
| | | public void sendInvoiceEmail(Integer memberId, Integer invoiceRecordId, String email) { |
| | | InvoiceRecord record = invoiceRecordMapper.selectById(invoiceRecordId); |
| | | if (record == null || Constants.equalsInteger(record.getDeleted(), Constants.ONE)) { |
| | | throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "å票记å½ä¸åå¨"); |
| | | } |
| | | if (!Constants.equalsInteger(record.getMemberId(), memberId)) { |
| | | throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "æ ææä½è¯¥å票记å½"); |
| | | } |
| | | if (!Constants.equalsInteger(record.getStatus(), Constants.ONE)) { |
| | | throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "åç¥¨å°æªå¼å
·æå"); |
| | | } |
| | | if (StringUtils.isBlank(record.getFileAddr())) { |
| | | throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "å票æä»¶ä¸åå¨"); |
| | | } |
| | | |
| | | // æ¼æ¥æä»¶å®æ´URL |
| | | String fullUrl = record.getFileAddr(); |
| | | if (!fullUrl.startsWith("http")) { |
| | | try { |
| | | String prefix = systemDictDataBiz.queryByCode(Constants.OSS, Constants.RESOURCE_PATH).getCode(); |
| | | fullUrl = prefix + fullUrl; |
| | | } catch (Exception e) { |
| | | throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "æä»¶å°åé
置缺失"); |
| | | } |
| | | } |
| | | |
| | | // ä¸è½½å票æä»¶ |
| | | byte[] fileBytes; |
| | | try { |
| | | fileBytes = new FtpUtil().getOnlineInputsteam(fullUrl); |
| | | } catch (Exception e) { |
| | | throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "å票æä»¶ä¸è½½å¤±è´¥"); |
| | | } |
| | | if (fileBytes == null || fileBytes.length == 0) { |
| | | throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "å票æä»¶ä¸ºç©º"); |
| | | } |
| | | |
| | | // åå
¥ä¸´æ¶æä»¶ |
| | | File tempFile = null; |
| | | try { |
| | | tempFile = File.createTempFile("invoice_", ".pdf"); |
| | | try (FileOutputStream fos = new FileOutputStream(tempFile)) { |
| | | fos.write(fileBytes); |
| | | } |
| | | |
| | | // æå»ºéä»¶å表 |
| | | String fileName = "å票_" + record.getOrderNo() + ".pdf"; |
| | | Map<String, Object> attachment = new HashMap<>(); |
| | | attachment.put("name", fileName); |
| | | attachment.put("file", tempFile); |
| | | |
| | | boolean success = emailService.sendWithAttachment(email, "æ¨ççµåå票", "æ¨å¥½ï¼æ¨çå票详è§éä»¶ï¼è¯·æ¥æ¶ã", Collections.singletonList(attachment)); |
| | | if (!success) { |
| | | throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "é®ä»¶åé失败"); |
| | | } |
| | | } catch (BusinessException e) { |
| | | throw e; |
| | | } catch (Exception e) { |
| | | throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "é®ä»¶åéå¼å¸¸"); |
| | | } finally { |
| | | if (tempFile != null && tempFile.exists()) { |
| | | tempFile.delete(); |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * æå»º admin 端å票æ¥è¯¢æ¡ä»¶ï¼findPage å summary å
±ç¨ï¼ |
| | | */ |
| | | private QueryWrapper<InvoiceRecord> buildAdminQueryWrapper(InvoiceRecord model) { |
| | | Utils.MP.blankToNull(model); |
| | | model.setDeleted(Constants.ZERO); |
| | | QueryWrapper<InvoiceRecord> qw = new QueryWrapper<>(); |
| | | qw.lambda().eq(InvoiceRecord::getDeleted, Constants.ZERO); |
| | | if (model.getInvoiceNo() != null && StringUtils.isNotBlank(model.getInvoiceNo())) { |
| | | qw.lambda().like(InvoiceRecord::getInvoiceNo, model.getInvoiceNo()); |
| | | } |
| | | if (model.getInvoiceType() != null) { |
| | | qw.lambda().eq(InvoiceRecord::getInvoiceType, model.getInvoiceType()); |
| | | } |
| | | if (model.getMemberId() != null) { |
| | | qw.lambda().eq(InvoiceRecord::getMemberId, model.getMemberId()); |
| | | } |
| | | if (model.getOrgType() != null) { |
| | | qw.lambda().eq(InvoiceRecord::getOrgType, model.getOrgType()); |
| | | } |
| | | if (model.getName() != null && StringUtils.isNotBlank(model.getName())) { |
| | | qw.lambda().like(InvoiceRecord::getName, model.getName()); |
| | | } |
| | | if (model.getStatus() != null) { |
| | | qw.lambda().eq(InvoiceRecord::getStatus, model.getStatus()); |
| | | } |
| | | if (model.getStartDate() != null) { |
| | | qw.lambda().ge(InvoiceRecord::getCreateTime, model.getStartDate()); |
| | | } |
| | | if (model.getEndDate() != null) { |
| | | qw.lambda().le(InvoiceRecord::getCreateTime, Utils.Date.getEnd(model.getEndDate())); |
| | | } |
| | | return qw; |
| | | } |
| | | |
| | | @Override |
| | | public InvoiceRecordSummaryVO findPageSummary(PageWrap<InvoiceRecord> pageWrap) { |
| | | QueryWrapper<InvoiceRecord> baseQw = buildAdminQueryWrapper(pageWrap.getModel()); |
| | | |
| | | // å¼ç¥¨æ»é¢ï¼ç¬¦åæ¡ä»¶çææè®°å½ |
| | | QueryWrapper<InvoiceRecord> totalQw = baseQw.clone(); |
| | | totalQw.select("IFNULL(SUM(INVOICE_AMOUNT), 0) as invoiceAmount"); |
| | | Map<String, Object> totalResult = invoiceRecordMapper.selectMaps(totalQw).stream().findFirst().orElse(null); |
| | | long totalAmount = totalResult != null && totalResult.get("invoiceAmount") != null |
| | | ? Long.parseLong(totalResult.get("invoiceAmount").toString()) : 0L; |
| | | |
| | | // å·²å¼ç¥¨æ»é¢ï¼status=1 |
| | | QueryWrapper<InvoiceRecord> issuedQw = baseQw.clone(); |
| | | issuedQw.eq("STATUS", Constants.ONE); |
| | | issuedQw.select("IFNULL(SUM(INVOICE_AMOUNT), 0) as invoiceAmount"); |
| | | Map<String, Object> issuedResult = invoiceRecordMapper.selectMaps(issuedQw).stream().findFirst().orElse(null); |
| | | long issuedAmount = issuedResult != null && issuedResult.get("invoiceAmount") != null |
| | | ? Long.parseLong(issuedResult.get("invoiceAmount").toString()) : 0L; |
| | | |
| | | InvoiceRecordSummaryVO vo = new InvoiceRecordSummaryVO(); |
| | | vo.setTotalAmount(totalAmount); |
| | | vo.setIssuedAmount(issuedAmount); |
| | | return vo; |
| | | } |
| | | } |
| | |
| | | import com.doumee.core.model.PageData; |
| | | import com.doumee.core.model.PageWrap; |
| | | import com.doumee.core.utils.Utils; |
| | | import com.doumee.dao.business.CouponMapper; |
| | | import com.doumee.dao.business.MemberCouponMapper; |
| | | import com.doumee.dao.business.model.Coupon; |
| | | import com.doumee.dao.business.model.MemberCoupon; |
| | | import com.doumee.dao.system.model.SystemUser; |
| | | import com.doumee.service.business.MemberCouponService; |
| | |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.util.CollectionUtils; |
| | | |
| | | import java.util.Calendar; |
| | | import java.util.Date; |
| | | import java.util.List; |
| | | import java.util.Objects; |
| | |
| | | |
| | | @Autowired |
| | | private MemberCouponMapper memberCouponMapper; |
| | | @Autowired |
| | | private CouponMapper couponMapper; |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = {Exception.class, BusinessException.class}) |
| | |
| | | QueryWrapper<MemberCoupon> wrapper = new QueryWrapper<>(memberCoupon); |
| | | return memberCouponMapper.selectCount(wrapper); |
| | | } |
| | | |
| | | @Override |
| | | public PageData<MemberCoupon> findMemberPage(Integer memberId, Integer status, PageWrap<MemberCoupon> pageWrap) { |
| | | IPage<MemberCoupon> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity()); |
| | | MPJLambdaWrapper<MemberCoupon> qw = new MPJLambdaWrapper<>(); |
| | | qw.selectAll(MemberCoupon.class) |
| | | .eq(MemberCoupon::getMemberId, memberId) |
| | | .eq(MemberCoupon::getIsdeleted, Constants.ZERO); |
| | | |
| | | if (status != null) { |
| | | if (status == Constants.CouponStatus.expired.getKey()) { |
| | | // 已失æå
å«ä¸¤ç§ï¼98=æªé¢åå·²è¿æ, 99=å·²è¿æ |
| | | qw.in(MemberCoupon::getStatus, |
| | | Constants.CouponStatus.expiredUnclaimed.getKey(), |
| | | Constants.CouponStatus.expired.getKey()); |
| | | } else { |
| | | qw.eq(MemberCoupon::getStatus, status); |
| | | } |
| | | } |
| | | |
| | | // æç¶ææåº |
| | | if (status != null) { |
| | | switch (status) { |
| | | case 0: // å¾
é¢å â å建æ¶é´ååº |
| | | case 98: // 已失æ(æ¥è¯¢æ¶å
å«äº98å99) |
| | | case 99: |
| | | qw.orderByDesc(MemberCoupon::getCreateDate); |
| | | break; |
| | | case 1: // å¾
ä½¿ç¨ â é¢åæ¶é´ååº |
| | | qw.orderByDesc(MemberCoupon::getValidDate); |
| | | break; |
| | | case 2: // å·²ä½¿ç¨ â ä½¿ç¨æ¶é´ååº |
| | | qw.orderByDesc(MemberCoupon::getUseDate); |
| | | break; |
| | | default: |
| | | qw.orderByDesc(MemberCoupon::getId); |
| | | break; |
| | | } |
| | | } else { |
| | | qw.orderByDesc(MemberCoupon::getId); |
| | | } |
| | | |
| | | return PageData.from(memberCouponMapper.selectJoinPage(page, MemberCoupon.class, qw)); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = {Exception.class, BusinessException.class}) |
| | | public void claimCoupon(Integer memberId, Integer couponId) { |
| | | // æ¥è¯¢è¯¥ä¼åçå¾
é¢å伿 å¸è®°å½ |
| | | MemberCoupon mc = memberCouponMapper.selectOne(new QueryWrapper<MemberCoupon>().lambda() |
| | | .eq(MemberCoupon::getId, couponId) |
| | | .eq(MemberCoupon::getMemberId, memberId) |
| | | .eq(MemberCoupon::getStatus, Constants.CouponStatus.waitClaim.getKey()) |
| | | .eq(MemberCoupon::getIsdeleted, Constants.ZERO)); |
| | | if (mc == null) { |
| | | throw new BusinessException(ResponseStatus.DATA_EMPTY); |
| | | } |
| | | // æ ¡éªä¼æ 叿¯å¦ææ |
| | | Coupon coupon = couponMapper.selectById(couponId); |
| | | if (coupon == null || coupon.getStatus() != Constants.ZERO) { |
| | | throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "伿 叿 æ"); |
| | | } |
| | | // æ è®°å·²é¢åï¼è®¡ç®æææ |
| | | Date now = new Date(); |
| | | Calendar cal = Calendar.getInstance(); |
| | | cal.setTime(now); |
| | | cal.add(Calendar.DAY_OF_MONTH, mc.getValidDays() != null ? mc.getValidDays() : 0); |
| | | memberCouponMapper.update(new UpdateWrapper<MemberCoupon>().lambda() |
| | | .set(MemberCoupon::getStatus, Constants.CouponStatus.claimed.getKey()) |
| | | .set(MemberCoupon::getValidDate, now) |
| | | .set(MemberCoupon::getStartDate, now) |
| | | .set(MemberCoupon::getEndDate, cal.getTime()) |
| | | .set(MemberCoupon::getEditDate, now) |
| | | .eq(MemberCoupon::getId, mc.getId())); |
| | | } |
| | | } |
| | |
| | | member.setAutoReceiveStatus(Constants.ONE); |
| | | member.setUserType(Constants.ZERO); |
| | | memberMapper.insert(member); |
| | | // 注åèµ é伿 å¸ |
| | | giftRegisterCoupons(member); |
| | | } |
| | | String token = JwtTokenUtil.generateTokenForRedis(member.getId(), Constants.ZERO, JSONObject.toJSONString(member), redisTemplate); |
| | | AccountResponse accountResponse = new AccountResponse(); |
| | |
| | | || ( StringUtils.isBlank(member.getCoverImage()) |
| | | && StringUtils.isBlank(member.getName()) |
| | | && StringUtils.isBlank(member.getNickName()) |
| | | && StringUtils.isBlank(member.getEmail()) |
| | | && Objects.isNull(member.getAutoReceiveStatus()) )){ |
| | | throw new BusinessException(ResponseStatus.BAD_REQUEST); |
| | | } |
| | |
| | | .set(StringUtils.isNotBlank(member.getNickName()),Member::getNickName,member.getNickName()) |
| | | .set(StringUtils.isNotBlank(member.getName()),Member::getName,member.getName()) |
| | | .set(StringUtils.isNotBlank(member.getCoverImage()),Member::getCoverImage,member.getCoverImage()) |
| | | .set(StringUtils.isNotBlank(member.getEmail()),Member::getEmail,member.getEmail()) |
| | | .set(Objects.nonNull(member.getAutoReceiveStatus()),Member::getAutoReceiveStatus,member.getAutoReceiveStatus()) |
| | | .set(Member::getUpdateTime,new Date()) |
| | | .eq(Member::getId,member.getId())); |
| | |
| | | userCenterVO.setTelephone(member.getTelephone()); |
| | | userCenterVO.setCoverImage(member.getCoverImage()); |
| | | userCenterVO.setOpenid(member.getOpenid()); |
| | | userCenterVO.setEmail(member.getEmail()); |
| | | if(StringUtils.isNotBlank(member.getCoverImage())){ |
| | | String path = systemDictDataBiz.queryByCode(Constants.OSS,Constants.RESOURCE_PATH).getCode() |
| | | +systemDictDataBiz.queryByCode(Constants.OSS,Constants.MEMBER_FILES).getCode(); |
| | |
| | | log.info("æ³¨åæ»¡å¹´èµ é伿 å¸å®æï¼å
±å¤ç{}åä¼å", giftedMemberCount); |
| | | } |
| | | |
| | | private void giftRegisterCoupons(Member member) { |
| | | String couponIdsStr = operationConfigBiz.getConfig().getRegisterGiftCouponIds(); |
| | | if (StringUtils.isBlank(couponIdsStr)) { |
| | | return; |
| | | } |
| | | String[] idArr = couponIdsStr.split(","); |
| | | Date now = new Date(); |
| | | for (String idStr : idArr) { |
| | | String trimmed = idStr.trim(); |
| | | if (StringUtils.isBlank(trimmed)) continue; |
| | | Coupon coupon = couponMapper.selectById(Integer.valueOf(trimmed)); |
| | | if (coupon == null || Constants.equalsInteger(coupon.getIsdeleted(), Constants.ONE)) continue; |
| | | MemberCoupon mc = new MemberCoupon(); |
| | | mc.setCouponId(coupon.getId()); |
| | | mc.setMemberId(member.getId()); |
| | | mc.setStatus(Constants.CouponStatus.waitClaim.getKey()); |
| | | Calendar validCal = Calendar.getInstance(); |
| | | validCal.add(Calendar.DAY_OF_MONTH, coupon.getPushDays() != null ? coupon.getPushDays() : 7); |
| | | mc.setValidDate(validCal.getTime()); |
| | | mc.setName(coupon.getName()); |
| | | mc.setInfo(coupon.getInfo()); |
| | | mc.setType(coupon.getType()); |
| | | mc.setLimitPrice(coupon.getLimitPrice()); |
| | | mc.setPrice(coupon.getPrice()); |
| | | mc.setGetMethod(coupon.getGetMethod()); |
| | | mc.setCouponType(coupon.getCouponType()); |
| | | mc.setPushDays(coupon.getPushDays()); |
| | | mc.setValidDays(coupon.getValidDays()); |
| | | mc.setIsdeleted(Constants.ZERO); |
| | | mc.setCreateDate(now); |
| | | mc.setEditDate(now); |
| | | memberCouponMapper.insert(mc); |
| | | } |
| | | } |
| | | |
| | | } |
| | |
| | | .select("o.type as orderType") |
| | | .select("o.good_level as goodLevel") |
| | | .select("o.total_amount as totalAmount") |
| | | .select("o.pay_amount as payAmount") |
| | | .select("(o.pay_amount + ifnull(o.OVERDUE_AMOUNT,0)) as payAmount") |
| | | .select("c2.name as goodLevelName") |
| | | .innerJoin("orders o on o.id = t.ORDER_ID ") |
| | | .leftJoin("category c1 on c1.id = o.GOOD_TYPE and c1.DELETED = 0") |
| | |
| | | import com.doumee.dao.dto.CommentOrderDTO; |
| | | import com.doumee.dao.dto.CreateOrderDTO; |
| | | import com.doumee.dao.dto.DispatchDTO; |
| | | import com.doumee.dao.dto.HandleOrderExceptionDTO; |
| | | import com.doumee.dao.dto.ManualRefundDTO; |
| | | import com.doumee.dao.dto.MyOrderDTO; |
| | | import com.doumee.dao.dto.OrderItemDTO; |
| | | import com.doumee.dao.vo.*; |
| | |
| | | @Autowired |
| | | private RevenueMapper revenueMapper; |
| | | |
| | | @Autowired |
| | | private RewardRecordMapper rewardRecordMapper; |
| | | |
| | | |
| | | |
| | | @Autowired |
| | |
| | | |
| | | @Autowired |
| | | private RedisTemplate<String, Object> redisTemplate; |
| | | |
| | | @Autowired |
| | | private MemberCouponMapper memberCouponMapper; |
| | | |
| | | @Autowired |
| | | private AreasBiz areasBiz; |
| | |
| | | .leftJoin(Category.class, Category::getId, Orders::getGoodType) |
| | | .leftJoin(DriverInfo.class, DriverInfo::getId, Orders::getAcceptDriver) |
| | | .leftJoin("shop_info s1 on s1.id = t.DEPOSIT_SHOP_ID") |
| | | .leftJoin("shop_info s2 on s2.id = t.TAKE_SHOP_ID"); |
| | | .leftJoin("shop_info s2 on s2.id = t.TAKE_SHOP_ID") ; |
| | | ; |
| | | Utils.MP.blankToNull(pageWrap.getModel()); |
| | | queryWrapper.eq(pageWrap.getModel().getDeleted() != null, Orders::getDeleted, pageWrap.getModel().getDeleted()); |
| | |
| | | if(Constants.equalsInteger(o.getIsUrgent(),Constants.ZERO)){ |
| | | o.setUrgentAmount(Constants.ZERO.longValue()); |
| | | } |
| | | // å®ä»éé¢ = æ¯ä»éé¢ - 鿬¾éé¢ + é¾æè´¹ç¨ |
| | | long pay = o.getPayAmount() != null ? o.getPayAmount() : 0L; |
| | | long refund = o.getRefundAmount() != null ? o.getRefundAmount() : 0L; |
| | | long overdue = o.getOverdueAmount() != null ? o.getOverdueAmount() : 0L; |
| | | o.setPayAmount(pay - refund + overdue); |
| | | } |
| | | return pageData; |
| | | } |
| | |
| | | result.setTotalPrice(totalPrice); |
| | | result.setDays(days); |
| | | result.setUrgentFee(0L); |
| | | resolveCoupon(result, dto.getMemberId(), dto.getCouponId(), totalPrice); |
| | | return result; |
| | | } |
| | | |
| | |
| | | } |
| | | } |
| | | |
| | | resolveCoupon(result, dto.getMemberId(), dto.getCouponId(), totalPrice); |
| | | return result; |
| | | } |
| | | |
| | | private void resolveCoupon(PriceCalculateVO result, Integer memberId, Integer couponId, long totalPrice) { |
| | | if (memberId == null) { |
| | | result.setDeductionAmount(0L); |
| | | return; |
| | | } |
| | | // æ¥è¯¢å¯ç¨ä¼æ å¸ï¼å·²é¢åãæªè¿æãæ»¡è¶³æ»¡é¢é¨æ§ |
| | | Date now = new Date(); |
| | | List<MemberCoupon> availableCoupons = memberCouponMapper.selectList(new QueryWrapper<MemberCoupon>().lambda() |
| | | .eq(MemberCoupon::getMemberId, memberId) |
| | | .eq(MemberCoupon::getStatus, Constants.CouponStatus.claimed.getKey()) |
| | | .eq(MemberCoupon::getIsdeleted, Constants.ZERO) |
| | | .le(MemberCoupon::getLimitPrice, totalPrice) |
| | | .ge(MemberCoupon::getEndDate, now) |
| | | .orderByDesc(MemberCoupon::getPrice) |
| | | .orderByAsc(MemberCoupon::getEndDate)); |
| | | result.setAvailableCoupons(availableCoupons); |
| | | |
| | | if (couponId == null) { |
| | | result.setDeductionAmount(0L); |
| | | return; |
| | | } |
| | | |
| | | MemberCoupon selected; |
| | | if (couponId == -1) { |
| | | selected = availableCoupons.isEmpty() ? null : availableCoupons.get(0); |
| | | } else { |
| | | selected = availableCoupons.stream() |
| | | .filter(mc -> mc.getId().equals(couponId)) |
| | | .findFirst().orElse(null); |
| | | if (selected == null) { |
| | | throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "伿 叿 ææä¸å¯ç¨"); |
| | | } |
| | | } |
| | | |
| | | if (selected != null) { |
| | | result.setDeductionAmount(selected.getPrice()); |
| | | result.setSelectedCoupon(selected); |
| | | } else { |
| | | result.setDeductionAmount(0L); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | |
| | | priceDTO.setDepositEndTime(takeTime); |
| | | priceDTO.setItems(dto.getItems()); |
| | | priceDTO.setDeclaredAmount(dto.getDeclaredAmount()); |
| | | priceDTO.setMemberId(memberId); |
| | | priceDTO.setCouponId(dto.getCouponId()); |
| | | priceResult = calculateLocalPrice(priceDTO); |
| | | } else { |
| | | // å¼å°å¯å |
| | |
| | | priceDTO.setItems(dto.getItems()); |
| | | priceDTO.setDeclaredAmount(dto.getDeclaredAmount()); |
| | | priceDTO.setUrgent(Constants.ONE.equals(dto.getIsUrgent())); |
| | | priceDTO.setMemberId(memberId); |
| | | priceDTO.setCouponId(dto.getCouponId()); |
| | | priceResult = calculateRemotePrice(priceDTO); |
| | | } |
| | | |
| | |
| | | // è´¹ç¨ä¿¡æ¯(å) |
| | | orders.setBasicAmount(priceResult.getItemPrice()); |
| | | orders.setEstimatedAmount(priceResult.getTotalPrice()); |
| | | orders.setTotalAmount(priceResult.getTotalPrice()); |
| | | long deductionAmount = priceResult.getDeductionAmount() != null ? priceResult.getDeductionAmount() : 0L; |
| | | orders.setTotalAmount(priceResult.getTotalPrice() - deductionAmount); |
| | | orders.setUrgentAmount(priceResult.getUrgentFee()); |
| | | orders.setCouponId(dto.getCouponId()); |
| | | orders.setDeductionAmount(deductionAmount); |
| | | orders.setManualRefund(Constants.ZERO); |
| | | // åå¨å æ¥ç³»æ° |
| | | if (Constants.ONE.equals(dto.getType()) && Constants.ONE.equals(dto.getIsUrgent())) { |
| | | String urgentRateStr = systemDictDataBiz.queryByCode( |
| | |
| | | |
| | | ordersMapper.insert(orders); |
| | | Integer orderId = orders.getId(); |
| | | |
| | | // æ è®°ä¼æ å¸å·²ä½¿ç¨ |
| | | MemberCoupon selectedCoupon = priceResult.getSelectedCoupon(); |
| | | if (selectedCoupon != null) { |
| | | memberCouponMapper.update(new UpdateWrapper<MemberCoupon>().lambda() |
| | | .set(MemberCoupon::getStatus, Constants.CouponStatus.used.getKey()) |
| | | .set(MemberCoupon::getUseDate, new Date()) |
| | | .set(MemberCoupon::getOrderId, orderId) |
| | | .eq(MemberCoupon::getId, selectedCoupon.getId())); |
| | | } |
| | | |
| | | // åå»ºè®¢åæ¥å¿ |
| | | OrderLog createLog = new OrderLog(); |
| | |
| | | |
| | | OrderDetailVO vo = new OrderDetailVO(); |
| | | vo.setOrder(order); |
| | | vo.setDeductionAmount(order.getDeductionAmount()); |
| | | |
| | | // 订åç¶ææè¿° |
| | | if (order.getStatus() != null) { |
| | |
| | | .select("s1.name", Orders::getDepositShopName) |
| | | .select("s1.link_name", Orders::getDepositShopLinkName) |
| | | .select("s1.link_phone", Orders::getDepositShopLinkPhone) |
| | | .select("s1.address", Orders::getDepositShopAddress) |
| | | .select("s2.name", Orders::getTakeShopName) |
| | | .select("s2.address", Orders::getTakeShopAddress) |
| | | .select("s2.link_phone", Orders::getTakeShopLinkPhone) |
| | |
| | | .eq(status != null, Orders::getStatus, status) |
| | | .in(statusList != null, Orders::getStatus, statusList) |
| | | .orderByDesc(Orders::getCreateTime); |
| | | // å¯å¼ç¥¨è®¢åï¼å¢å æä»½éå¶ |
| | | if (model != null && model.getInvoiceStatus() != null && Constants.equalsInteger(model.getInvoiceStatus(), Constants.ONE)) { |
| | | wrapper.in(Orders::getInvoiceStatus, Arrays.asList(Constants.ONE, 99)); |
| | | String monthLimitStr = operationConfigBiz.getConfig().getInvoiceMonthLimit(); |
| | | if (StringUtils.isNotBlank(monthLimitStr)) { |
| | | int monthLimit = Integer.parseInt(monthLimitStr); |
| | | Calendar cal = Calendar.getInstance(); |
| | | cal.add(Calendar.MONTH, -monthLimit); |
| | | cal.set(Calendar.HOUR_OF_DAY, 0); |
| | | cal.set(Calendar.MINUTE, 0); |
| | | cal.set(Calendar.SECOND, 0); |
| | | cal.set(Calendar.MILLISECOND, 0); |
| | | wrapper.ge(Orders::getFinishTime, cal.getTime()); |
| | | } |
| | | } |
| | | // å
³é®è¯æç´¢ï¼æ¶ä»¶äºº/æ¶ä»¶äººçµè¯æ¨¡ç³ã订åå·ç²¾å |
| | | if (model != null && StringUtils.isNotBlank(model.getKeyword())) { |
| | | String kw = model.getKeyword().trim(); |
| | |
| | | vo.setDepositShopName(o.getDepositShopName()); |
| | | vo.setDepositShopLinkName(o.getDepositShopLinkName()); |
| | | vo.setDepositShopPhone(o.getDepositShopLinkPhone()); |
| | | |
| | | vo.setDepositShopAddress(o.getDepositShopAddress()); |
| | | // åä»¶ä¿¡æ¯ï¼æåä»¶é¨åºåé¨åºï¼æ ååç¨æ·èªéåä»¶ç¹ |
| | | if (o.getTakeShopId() != null) { |
| | | vo.setTakeShopId(o.getTakeShopId()); |
| | |
| | | vo.setOrderImages(getFileUrlsFromList(o.getId(),files)); |
| | | // é¾æç¶æ |
| | | fillOverdueStatus(vo, o, details); |
| | | // 伿 叿µæ£éé¢ |
| | | vo.setDeductionAmount(o.getDeductionAmount()); |
| | | // å¯å¼ç¥¨éé¢ï¼æ¯ä»éé¢ - 鿬¾éé¢ï¼ |
| | | if (model != null && model.getInvoiceStatus() != null && Constants.equalsInteger(model.getInvoiceStatus(), Constants.ONE)) { |
| | | long payAmt = o.getPayAmount() != null ? o.getPayAmount() : 0L; |
| | | long refundAmt = o.getRefundAmount() != null ? o.getRefundAmount() : 0L; |
| | | vo.setInvoiceAmount(payAmt - refundAmt); |
| | | } |
| | | voList.add(vo); |
| | | } |
| | | } |
| | |
| | | //åºå· |
| | | vo.setSortnum(Constants.formatIntegerNum(order.getDepositShopId())+"-"+order.getId()); |
| | | if(order.getTakeShopId()!=null){ |
| | | vo.setSortnumTake(Constants.formatIntegerNum(order.getTakeShopId())+"-"+order.getId()); |
| | | String dateStr = new SimpleDateFormat("dd").format(order.getPayTime() != null ? order.getPayTime() : new Date()); |
| | | String autoNumStr = String.format("%03d", order.getAutoNum() != null ? order.getAutoNum() : 0); |
| | | String sort = order.getTakeShopId() + "-" + dateStr + "-" + autoNumStr; |
| | | vo.setSortnumTake(sort); |
| | | } |
| | | // åä»¶é¨åº |
| | | if (order.getDepositShopId() != null) { |
| | |
| | | order.setStatus(Constants.OrderStatus.cancelled.getStatus()); |
| | | order.setCancelTime(now); |
| | | ordersMapper.updateById(order); |
| | | restoreCoupon(order); |
| | | saveCancelLog(order, Constants.OrderLogType.memberCancel, "ä¼ååæ¶è®¢åï¼å¾
æ¯ä»ï¼", memberId); |
| | | // çä¿¡éç¥ä¼åï¼è®¢å已忶 |
| | | Member cancelMember1 = memberMapper.selectById(memberId); |
| | |
| | | throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鿬¾å¤±è´¥ï¼è¯·è系客æå¤ç"); |
| | | } |
| | | ordersRefundMapper.insert(refund); |
| | | restoreCoupon(order); |
| | | return; |
| | | } |
| | | |
| | |
| | | /** |
| | | * ä¿ååæ¶è®¢åæä½æ¥å¿ |
| | | */ |
| | | private void restoreCoupon(Orders order) { |
| | | // if (order.getCouponId() == null || order.getDeductionAmount() == null || order.getDeductionAmount() <= 0) { |
| | | // return; |
| | | // } |
| | | // memberCouponMapper.update(new UpdateWrapper<MemberCoupon>().lambda() |
| | | // .set(MemberCoupon::getStatus, Constants.CouponStatus.claimed.getKey()) |
| | | // .set(MemberCoupon::getUseDate, null) |
| | | // .set(MemberCoupon::getOrderId, null) |
| | | // .eq(MemberCoupon::getId, order.getCouponId()) |
| | | // .eq(MemberCoupon::getOrderId, order.getId()) |
| | | // .eq(MemberCoupon::getStatus, Constants.CouponStatus.used.getKey())); |
| | | } |
| | | |
| | | private void saveCancelLog(Orders order, Constants.OrderLogType logType, String reason, Integer memberId) { |
| | | OrderLog log = new OrderLog(); |
| | | log.setOrderId(order.getId()); |
| | |
| | | log.setCreateTime(new Date()); |
| | | log.setDeleted(Constants.ZERO); |
| | | orderLogService.create(log); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void manualRefund(ManualRefundDTO dto, Integer userId) { |
| | | // 1. æ ¡éªè®¢å |
| | | Orders order = ordersMapper.selectById(dto.getOrderId()); |
| | | if (order == null || Constants.equalsInteger(order.getDeleted(), Constants.ONE)) { |
| | | throw new BusinessException(ResponseStatus.DATA_EMPTY); |
| | | } |
| | | if (!Constants.equalsInteger(order.getStatus(), Constants.OrderStatus.finished.getStatus())) { |
| | | throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "ä»
å·²å®æè®¢å坿å¨é款"); |
| | | } |
| | | if (Constants.equalsInteger(order.getManualRefund(), Constants.ONE)) { |
| | | throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "该订åå·²æå¨é款"); |
| | | } |
| | | // å¼å¸¸è®¢åä¸å
许æå¨é款 |
| | | if (Constants.equalsInteger(order.getExceptionStatus(), Constants.ONE)) { |
| | | throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "å¼å¸¸è®¢å䏿¯ææå¨é款"); |
| | | } |
| | | |
| | | // 2. æ ¡éªé款éé¢ |
| | | long payAmount = order.getPayAmount() != null ? order.getPayAmount() : 0L; |
| | | long existingRefund = order.getRefundAmount() != null ? order.getRefundAmount() : 0L; |
| | | long maxRefund = payAmount - existingRefund; |
| | | if (dto.getRefundAmount() <= 0) { |
| | | throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鿬¾éé¢å¿
须大äº0"); |
| | | } |
| | | if (dto.getRefundAmount() > maxRefund) { |
| | | throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鿬¾éé¢ä¸è½è¶
è¿å¯ééé¢(" + maxRefund + "å)"); |
| | | } |
| | | |
| | | // 3. æ ¡éªå¹¶æ¸
çæ£æ¬¾éé¢ï¼æ ¹æ®è®¢åç±»åï¼ |
| | | boolean isRemote = Constants.equalsInteger(order.getType(), Constants.ONE); |
| | | Long depositShopDeduct = dto.getDepositShopDeduct(); |
| | | Long takeShopDeduct = dto.getTakeShopDeduct(); |
| | | Long driverDeduct = dto.getDriverDeduct(); |
| | | |
| | | if (!isRemote) { |
| | | takeShopDeduct = null; |
| | | driverDeduct = null; |
| | | } else { |
| | | if (order.getTakeShopId() == null) { |
| | | takeShopDeduct = null; |
| | | } |
| | | } |
| | | if (depositShopDeduct != null && depositShopDeduct < 0) { |
| | | throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "åä»¶é¨åºæ£æ¬¾éé¢ä¸è½ä¸ºè´"); |
| | | } |
| | | if (takeShopDeduct != null && takeShopDeduct < 0) { |
| | | throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "åä»¶é¨åºæ£æ¬¾éé¢ä¸è½ä¸ºè´"); |
| | | } |
| | | if (driverDeduct != null && driverDeduct < 0) { |
| | | throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "叿ºæ£æ¬¾éé¢ä¸è½ä¸ºè´"); |
| | | } |
| | | |
| | | // 4. æå»º deductInfo JSON |
| | | String deductInfo = null; |
| | | JSONObject deductJson = new JSONObject(); |
| | | if (depositShopDeduct != null) { |
| | | deductJson.put("depositShopDeduct", depositShopDeduct); |
| | | } |
| | | if (takeShopDeduct != null) { |
| | | deductJson.put("takeShopDeduct", takeShopDeduct); |
| | | } |
| | | if (driverDeduct != null) { |
| | | deductJson.put("driverDeduct", driverDeduct); |
| | | } |
| | | if (deductJson.size() > 0) { |
| | | deductInfo = deductJson.toJSONString(); |
| | | } |
| | | |
| | | // 5. åå»ºéæ¬¾è®°å½ |
| | | Date now = new Date(); |
| | | String outRefundNo = ID.nextGUID(); |
| | | OrdersRefund refund = new OrdersRefund(); |
| | | refund.setOrderId(order.getId()); |
| | | refund.setType(Constants.FOUR); // æå¨é款 |
| | | refund.setRefundAmount(dto.getRefundAmount()); |
| | | refund.setDeductInfo(deductInfo); |
| | | refund.setRefundRemark(dto.getRemark()); |
| | | refund.setUserId(userId); |
| | | refund.setBeforeStatus(order.getStatus()); |
| | | refund.setRefundCode(outRefundNo); |
| | | refund.setCreateTime(now); |
| | | refund.setDeleted(Constants.ZERO); |
| | | ordersRefundMapper.insert(refund); |
| | | |
| | | // 6. è°ç¨å¾®ä¿¡é款 |
| | | try { |
| | | Refund refundResult = wxPayV3Service.refund( |
| | | outRefundNo, order.getOutTradeNo(), payAmount, dto.getRefundAmount(), |
| | | "æå¨é款", wxPayProperties.getV3RefundNotifyUrl()); |
| | | |
| | | com.wechat.pay.java.service.refund.model.Status refundStatus = refundResult.getStatus(); |
| | | if (com.wechat.pay.java.service.refund.model.Status.SUCCESS.equals(refundStatus)) { |
| | | refund.setStatus(Constants.ONE); |
| | | refund.setRefundTime(now); |
| | | ordersRefundMapper.updateById(refund); |
| | | // 鿬¾æåï¼æ§è¡æ£æ¬¾ |
| | | processManualRefundDeduction(order, depositShopDeduct, takeShopDeduct, driverDeduct); |
| | | } else if (com.wechat.pay.java.service.refund.model.Status.PROCESSING.equals(refundStatus)) { |
| | | refund.setStatus(Constants.ZERO); // 鿬¾ä¸ï¼çåè° |
| | | ordersRefundMapper.updateById(refund); |
| | | } else { |
| | | refund.setStatus(Constants.TWO); |
| | | refund.setRefundRemark("å¾®ä¿¡éæ¬¾å¤±è´¥: " + refundStatus.name()); |
| | | ordersRefundMapper.updateById(refund); |
| | | throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鿬¾å¤±è´¥ï¼è¯·è系客æå¤ç"); |
| | | } |
| | | } catch (BusinessException e) { |
| | | throw e; |
| | | } catch (Exception e) { |
| | | log.error("æå¨é款è°ç¨å¾®ä¿¡é款å¼å¸¸, orderId={}", order.getId(), e); |
| | | refund.setStatus(Constants.TWO); |
| | | ordersRefundMapper.updateById(refund); |
| | | throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鿬¾è°ç¨å¼å¸¸ï¼è¯·ç¨åéè¯"); |
| | | } |
| | | |
| | | // 7. æ´æ°è®¢åï¼æ è®°å·²æå¨é款ï¼ç´¯å 鿬¾éé¢ |
| | | ordersMapper.update(new UpdateWrapper<Orders>().lambda() |
| | | .set(Orders::getManualRefund, Constants.ONE) |
| | | .setSql(" REFUND_AMOUNT = IFNULL(REFUND_AMOUNT, 0) + " + dto.getRefundAmount()) |
| | | .set(Orders::getUpdateTime, now) |
| | | .eq(Orders::getId, order.getId())); |
| | | } |
| | | |
| | | /** |
| | | * æå¨é款æååï¼æ ¹æ®æ£æ¬¾ä¿¡æ¯æ£é¤å¯¹åºæ¹ä½é¢å¹¶çææ¶æ¯è®°å½ |
| | | */ |
| | | private void processManualRefundDeduction(Orders order, Long depositShopDeduct, Long takeShopDeduct, Long driverDeduct) { |
| | | Date now = new Date(); |
| | | |
| | | // åä»¶é¨åºæ£æ¬¾ |
| | | if (depositShopDeduct != null && depositShopDeduct > 0 && order.getDepositShopId() != null) { |
| | | ShopInfo depositShop = shopInfoMapper.selectById(order.getDepositShopId()); |
| | | if (depositShop != null) { |
| | | shopInfoMapper.update(new UpdateWrapper<ShopInfo>().lambda() |
| | | .setSql(" BALANCE = IFNULL(BALANCE, 0) - " + depositShopDeduct) |
| | | .eq(ShopInfo::getId, depositShop.getId())); |
| | | revenueMapper.insert(buildDeductRevenue(depositShop.getId(), Constants.TWO, |
| | | depositShopDeduct, order.getId(), order.getCode(), now)); |
| | | } |
| | | } |
| | | |
| | | // åä»¶é¨åºæ£æ¬¾ |
| | | if (takeShopDeduct != null && takeShopDeduct > 0 && order.getTakeShopId() != null) { |
| | | ShopInfo takeShop = shopInfoMapper.selectById(order.getTakeShopId()); |
| | | if (takeShop != null) { |
| | | shopInfoMapper.update(new UpdateWrapper<ShopInfo>().lambda() |
| | | .setSql(" BALANCE = IFNULL(BALANCE, 0) - " + takeShopDeduct) |
| | | .eq(ShopInfo::getId, takeShop.getId())); |
| | | revenueMapper.insert(buildDeductRevenue(takeShop.getId(), Constants.TWO, |
| | | takeShopDeduct, order.getId(), order.getCode(), now)); |
| | | } |
| | | } |
| | | |
| | | // 叿ºæ£æ¬¾ |
| | | if (driverDeduct != null && driverDeduct > 0 && order.getAcceptDriver() != null) { |
| | | DriverInfo driver = driverInfoMapper.selectById(order.getAcceptDriver()); |
| | | if (driver != null && driver.getMemberId() != null) { |
| | | driverInfoMapper.update(new UpdateWrapper<DriverInfo>().lambda() |
| | | .setSql(" BALANCE = IFNULL(BALANCE, 0) - " + driverDeduct) |
| | | .eq(DriverInfo::getId, driver.getId())); |
| | | revenueMapper.insert(buildDeductRevenue(driver.getMemberId(), Constants.ONE, |
| | | driverDeduct, order.getId(), order.getCode(), now)); |
| | | } |
| | | } |
| | | } |
| | | |
| | | private Revenue buildDeductRevenue(Integer memberId, Integer memberType, Long amount, Integer orderId, String orderNo, Date now) { |
| | | Revenue revenue = new Revenue(); |
| | | revenue.setMemberId(memberId); |
| | | revenue.setMemberType(memberType); |
| | | revenue.setType(Constants.FOUR); // è´£ä»»æ£æ¬¾ |
| | | revenue.setOptType(-Constants.ONE); // æ¯åº |
| | | revenue.setAmount(amount); |
| | | revenue.setVaildStatus(Constants.ONE); // å·²å
¥è´¦ |
| | | revenue.setObjId(orderId); |
| | | revenue.setObjType(Constants.ZERO); // 订åä¸å¡ |
| | | revenue.setOrderNo(orderNo); |
| | | revenue.setStatus(Constants.ZERO); // æå |
| | | revenue.setDeleted(Constants.ZERO); |
| | | revenue.setCreateTime(now); |
| | | return revenue; |
| | | } |
| | | |
| | | @Override |
| | | public void processManualRefundCallback(OrdersRefund refundRecord) { |
| | | if (!Constants.equalsInteger(refundRecord.getType(), Constants.FOUR)) { |
| | | return; |
| | | } |
| | | if (StringUtils.isBlank(refundRecord.getDeductInfo())) { |
| | | return; |
| | | } |
| | | Orders order = ordersMapper.selectById(refundRecord.getOrderId()); |
| | | if (order == null) { |
| | | return; |
| | | } |
| | | JSONObject deductJson = JSONObject.parseObject(refundRecord.getDeductInfo()); |
| | | Long depositShopDeduct = deductJson.getLong("depositShopDeduct"); |
| | | Long takeShopDeduct = deductJson.getLong("takeShopDeduct"); |
| | | Long driverDeduct = deductJson.getLong("driverDeduct"); |
| | | processManualRefundDeduction(order, depositShopDeduct, takeShopDeduct, driverDeduct); |
| | | |
| | | // æ 记订åå·²æå¨é款ï¼ç´¯å 鿬¾éé¢ |
| | | ordersMapper.update(new UpdateWrapper<Orders>().lambda() |
| | | .set(Orders::getManualRefund, Constants.ONE) |
| | | .setSql(" REFUND_AMOUNT = IFNULL(REFUND_AMOUNT, 0) + " + refundRecord.getRefundAmount()) |
| | | .set(Orders::getUpdateTime, new Date()) |
| | | .eq(Orders::getId, order.getId())); |
| | | } |
| | | |
| | | /** |
| | |
| | | * åé叿ºç«å
ä¿¡éç¥ |
| | | */ |
| | | private void sendDriverNotice(Integer driverId, Constants.DriverOrderNotify notify, Integer orderId, String... params) { |
| | | sendDriverNotice(driverId, notify, orderId, 0, params); |
| | | } |
| | | |
| | | private void sendDriverNotice(Integer driverId, Constants.DriverOrderNotify notify, Integer objId, Integer objType, String... params) { |
| | | DriverInfo driver = driverInfoMapper.selectById(driverId); |
| | | if (driver == null || driver.getMemberId() == null) { |
| | | return; |
| | |
| | | notice.setUserId(driver.getMemberId()); |
| | | notice.setTitle(notify.getTitle()); |
| | | notice.setContent(notify.format(params)); |
| | | notice.setObjId(orderId); |
| | | notice.setObjType(0); // 0=订å |
| | | notice.setObjId(objId); |
| | | notice.setObjType(objType); |
| | | notice.setStatus(0); // 0=æªè¯» |
| | | notice.setIsdeleted(Constants.ZERO); |
| | | notice.setCreateDate(new Date()); |
| | |
| | | order.setMemberVerifyCode(generateVerifyCode()); |
| | | ordersMapper.updateById(order); |
| | | // å¯åæ¶å¾çå¿
å¡« |
| | | if (images == null || images.isEmpty()) { |
| | | throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "请ä¸ä¼ å¯åå¾ç"); |
| | | } |
| | | // if (images == null || images.isEmpty()) { |
| | | // throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "请ä¸ä¼ å¯åå¾ç"); |
| | | // } |
| | | // ä¿åå¯åå¾çï¼obj_type=2 订åå¯åå¾çï¼æå¤3å¼ ï¼ |
| | | saveVerifyImages(order.getId(), images, Constants.FileType.ORDER_DEPOSIT.getKey(), shopId); |
| | | // è®°å½è®¢åæ¥å¿ |
| | |
| | | } |
| | | // å¾
åä»¶(5) â 已宿(7) |
| | | order.setStatus(Constants.OrderStatus.finished.getStatus()); |
| | | order.setConfirmArriveTime(now); |
| | | order.setFinishTime(now); |
| | | order.setInvoiceStatus(Constants.ONE); |
| | | ordersMapper.updateById(order); |
| | | // å°±å°å¯å(type=0)åä»¶æ¶å¾çä¸å¿
å¡«ï¼å
¶ä»ç±»ååä»¶å¿
å¡« |
| | | if (!Constants.equalsInteger(order.getType(), Constants.ZERO)) { |
| | |
| | | sendOrderNotice(order.getMemberId(), Constants.MemberOrderNotify.WAIT_PICKUP_REMIND, order.getId(), |
| | | "orderNo", order.getCode(), "shopName", shopName); |
| | | } |
| | | // å¼å¸¸è®¢åå¯åæ ¸éï¼æ è®°å订å宿 |
| | | if (Constants.equalsInteger(order.getExceptionStatus(), Constants.ONE) && order.getRelationOrderId() != null) { |
| | | Orders originalOrder = ordersMapper.selectById(order.getRelationOrderId()); |
| | | if (originalOrder != null) { |
| | | originalOrder.setStatus(Constants.OrderStatus.finished.getStatus()); |
| | | originalOrder.setInvoiceStatus(Constants.ONE); |
| | | originalOrder.setFinishTime(now); |
| | | originalOrder.setUpdateTime(now); |
| | | ordersMapper.updateById(originalOrder); |
| | | // 触ååè®¢åæ¶çè®¡ç® |
| | | calculateAndSaveOrderFees(originalOrder.getId()); |
| | | generateRevenueRecords(originalOrder.getId()); |
| | | // éç¥ä¼åï¼è®¢å已宿 |
| | | sendOrderNotice(originalOrder.getMemberId(), Constants.MemberOrderNotify.FINISHED, originalOrder.getId(), |
| | | "orderNo", originalOrder.getCode()); |
| | | // éç¥å¸æºï¼è®¢å已宿 |
| | | if (originalOrder.getAcceptDriver() != null) { |
| | | String settleDays = operationConfigBiz.getConfig().getSettlementDate(); |
| | | sendDriverNotice(originalOrder.getAcceptDriver(), Constants.DriverOrderNotify.FINISHED, originalOrder.getId(), |
| | | "orderNo", originalOrder.getCode(), |
| | | "settleDays", settleDays != null ? settleDays : "7"); |
| | | } |
| | | } |
| | | } |
| | | } else if (Constants.equalsInteger(status, Constants.OrderStatus.arrived.getStatus())) { |
| | | // å¼å°å¯å + æ åä»¶é¨åº â æ æ³æ ¸éï¼å®¢æ·èªåï¼æ é¨åºæä½ï¼ |
| | | if (Constants.equalsInteger(order.getType(), Constants.ONE) && order.getTakeShopId() == null) { |
| | |
| | | } |
| | | // å¾
åä»¶(5) â 已宿(7) |
| | | order.setStatus(Constants.OrderStatus.finished.getStatus()); |
| | | order.setInvoiceStatus(Constants.ONE); |
| | | order.setConfirmArriveTime(now); |
| | | ordersMapper.updateById(order); |
| | | // 订å宿ï¼éæ¾æ ¸éç |
| | |
| | | // 7. æ´æ°è®¢åç¶æä¸ºå·²å®æ |
| | | Date now = new Date(); |
| | | order.setStatus(Constants.OrderStatus.finished.getStatus()); |
| | | order.setInvoiceStatus(Constants.ONE); |
| | | order.setFinishTime(now); |
| | | order.setUpdateTime(now); |
| | | ordersMapper.updateById(order); |
| | |
| | | if (!Constants.equalsInteger(order.getStatus(), Constants.OrderStatus.arrived.getStatus())) { |
| | | throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "å½å订åç¶æä¸å
许确认æ¶è´§"); |
| | | } |
| | | // 5.1 æ ¡éªå¼å¸¸ç¶æ |
| | | if (Constants.equalsInteger(order.getExceptionStatus(), Constants.ONE)) { |
| | | throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "订åå¼å¸¸ï¼å·²è¢«è½¬åï¼è¯·è系管çåææ¥ççä¿¡"); |
| | | } |
| | | |
| | | // 6. æ´æ°è®¢åç¶æä¸ºå·²å®æ |
| | | Date now = new Date(); |
| | | order.setStatus(Constants.OrderStatus.finished.getStatus()); |
| | | order.setInvoiceStatus(Constants.ONE); |
| | | order.setFinishTime(now); |
| | | order.setUpdateTime(now); |
| | | ordersMapper.updateById(order); |
| | |
| | | BigDecimal depositRate = order.getDepositShopFeeRata() != null ? order.getDepositShopFeeRata() : BigDecimal.ZERO; |
| | | BigDecimal takeRate = order.getTakeShopFeeRata() != null ? order.getTakeShopFeeRata() : BigDecimal.ZERO; |
| | | BigDecimal driverRate = order.getDriverFeeRata() != null ? order.getDriverFeeRata() : BigDecimal.ZERO; |
| | | Long exceptionFeeVal = order.getExceptionFee() != null ? order.getExceptionFee() : 0L; |
| | | |
| | | //åä»¶é¨åºæ¶ç |
| | | Long depositShopFee = new BigDecimal(totalAmount) |
| | |
| | | driverFee = new BigDecimal(totalAmount) |
| | | .multiply(driverRate) |
| | | .setScale(0, RoundingMode.HALF_UP) |
| | | .longValue() |
| | | + exceptionFeeVal; |
| | | .longValue(); |
| | | |
| | | // å¼å°å¯å䏿åä»¶é¨åºï¼å ä¸åä»¶é¨åºæ¶ç |
| | | if (order.getTakeShopId() != null) { |
| | |
| | | driverFee, orderId, order.getCode())); |
| | | } |
| | | } |
| | | |
| | | // å¼å¸¸è®¢åï¼å¸æºå¼å¸¸è¡¥å¿ï¼å¼å° + å¼å¸¸æ è®° + æå¼å¸¸è¡¥å¿éé¢ï¼ |
| | | if (Constants.equalsInteger(order.getType(), Constants.ONE) |
| | | && Constants.equalsInteger(order.getExceptionStatus(), Constants.ONE) |
| | | && order.getExceptionFee() != null && order.getExceptionFee() > 0 |
| | | && order.getAcceptDriver() != null) { |
| | | DriverInfo driver = driverInfoMapper.selectById(order.getAcceptDriver()); |
| | | if (driver != null && driver.getMemberId() != null) { |
| | | Revenue exRevenue = new Revenue(); |
| | | exRevenue.setMemberId(driver.getMemberId()); |
| | | exRevenue.setMemberType(Constants.ONE); // 1=叿º |
| | | exRevenue.setType(5); // 5=å¼å¸¸éé¢ |
| | | exRevenue.setOptType(Constants.ONE); // 1=æ¶å
¥ |
| | | exRevenue.setAmount(order.getExceptionFee()); |
| | | exRevenue.setVaildStatus(Constants.ZERO); |
| | | exRevenue.setObjId(orderId); |
| | | exRevenue.setObjType(Constants.ZERO); |
| | | exRevenue.setStatus(Constants.ZERO); |
| | | exRevenue.setOrderNo(order.getCode()); |
| | | exRevenue.setDeleted(Constants.ZERO); |
| | | exRevenue.setCreateTime(now); |
| | | revenueMapper.insert(exRevenue); |
| | | } |
| | | } |
| | | |
| | | // 叿ºå¥å±éï¼ä»
çæå¥å±è®°å½ï¼ä¸ç´æ¥å
¥è´¦ï¼ |
| | | generateDriverReward(order); |
| | | } |
| | | |
| | | /** |
| | | * çæå¸æºå¥å±è®°å½ |
| | | * è§åï¼ |
| | | * å·²å¥å±æ¬¡æ° < registerRewardOrderCount â æ³¨åå¥å±ï¼type=0, amount=registerRewardAmountï¼ |
| | | * registerRewardOrderCount <= å·²å¥å±æ¬¡æ° < (registerRewardOrderCount + platformRewardOrderCount) â å¹³å°å¥å±ï¼type=1, amount=platformRewardAmountï¼ |
| | | * è¶
åºæ»åé¢ä¸å¥å± |
| | | */ |
| | | private void generateDriverReward(Orders order) { |
| | | if (order.getAcceptDriver() == null) return; |
| | | DriverInfo driver = driverInfoMapper.selectById(order.getAcceptDriver()); |
| | | if (driver == null || driver.getId() == null) return; |
| | | |
| | | // 读åå¥å±é
ç½® |
| | | String registerCountStr = operationConfigBiz.getConfig().getRegisterRewardOrderCount(); |
| | | String registerAmountStr = operationConfigBiz.getConfig().getRegisterRewardAmount(); |
| | | String platformCountStr = operationConfigBiz.getConfig().getPlatformRewardOrderCount(); |
| | | String platformAmountStr = operationConfigBiz.getConfig().getPlatformRewardAmount(); |
| | | if (StringUtils.isAnyBlank(registerCountStr, registerAmountStr, platformCountStr, platformAmountStr)) return; |
| | | |
| | | int registerCount = Integer.parseInt(registerCountStr); |
| | | long registerAmount = new BigDecimal(registerAmountStr).multiply(BigDecimal.valueOf(100)).longValue(); |
| | | int platformCount = Integer.parseInt(platformCountStr); |
| | | long platformAmount = new BigDecimal(platformAmountStr).multiply(BigDecimal.valueOf(100)).longValue(); |
| | | int totalRewardSlots = registerCount + platformCount; // æ»å¥å±åé¢ |
| | | |
| | | // æ¥è¯¢å¸æºå·²å¥å±æ¬¡æ° |
| | | Long rewarded = rewardRecordMapper.selectCount(new QueryWrapper<RewardRecord>().lambda() |
| | | .eq(RewardRecord::getDriverId, driver.getId()) |
| | | .eq(RewardRecord::getDeleted, Constants.ZERO)); |
| | | int count = rewarded.intValue(); |
| | | if (count >= totalRewardSlots) return; // å·²è¶
åºå¥å±åé¢ |
| | | |
| | | // å¤ææ¬æ¬¡å¥å±ç±»ååéé¢ |
| | | int rewardType; |
| | | long rewardAmount; |
| | | if (count < registerCount) { |
| | | // 注åå¥å±é¶æ®µ |
| | | rewardType = Constants.ZERO; |
| | | rewardAmount = registerAmount; |
| | | } else { |
| | | // å¹³å°å¥å±é¶æ®µ |
| | | rewardType = Constants.ONE; |
| | | rewardAmount = platformAmount; |
| | | } |
| | | if (rewardAmount <= 0) return; |
| | | |
| | | // å建å¥å±è®°å½ï¼ç¶æ=0å¾
é¢åï¼åç»ç±å¸æºé¢åæ¶å
¥è´¦ï¼ |
| | | RewardRecord record = new RewardRecord(); |
| | | record.setOrderId(order.getId()); |
| | | record.setDriverId(driver.getId()); |
| | | record.setStatus(Constants.ZERO); // 0=å¾
é¢å |
| | | record.setType(rewardType); // 0=注åå¥å±, 1=å¹³å°å¥å± |
| | | record.setAmount(rewardAmount); |
| | | record.setDeleted(Constants.ZERO); |
| | | record.setCreateTime(new Date()); |
| | | rewardRecordMapper.insert(record); |
| | | } |
| | | |
| | | /** |
| | |
| | | .eq(OrdersDetail::getOrderId, orderId) |
| | | .eq(OrdersDetail::getDeleted, Constants.ZERO)); |
| | | |
| | | OverdueFeeVO overdueInfo = calculateOverdueFeeInternal(order, details); |
| | | |
| | | Date now = new Date(); |
| | | |
| | | // å¼å¸¸è®¢å龿é»è¾ |
| | | if (Constants.equalsInteger(order.getExceptionStatus(), Constants.ONE) |
| | | && order.getRelationOrderId() != null) { |
| | | Orders originalOrder = ordersMapper.selectById(order.getRelationOrderId()); |
| | | long driverExceptionFee = (originalOrder != null && originalOrder.getExceptionFee() != null) |
| | | ? originalOrder.getExceptionFee() : 0L; |
| | | long shopExceptionFee = order.getShopCompensationAmount() != null ? order.getShopCompensationAmount() : 0L; |
| | | long totalExceptionFee = driverExceptionFee + shopExceptionFee; |
| | | |
| | | // 夿æ¯å¦å½å¤©åä»¶ï¼æ expectedTakeTime æ¥æï¼ |
| | | boolean sameDay = isSameDay(now, order.getExpectedTakeTime()); |
| | | |
| | | long overdueFee; |
| | | int overdueDays; |
| | | if (sameDay) { |
| | | // å½å¤©åä»¶ï¼é¾æè´¹ç¨ = å¼å¸¸è´¹ç¨æ»å |
| | | overdueFee = totalExceptionFee; |
| | | overdueDays = totalExceptionFee > 0 ? 1 : 0; |
| | | } else { |
| | | // éå½å¤©åä»¶ï¼æ£å¸¸é¾æè®¡ç® + 叿ºå¼å¸¸è´¹ç¨ï¼ä¸å«é¨åºå¼å¸¸è´¹ç¨ï¼ |
| | | OverdueFeeVO normalOverdue = calculateOverdueFeeInternal(order, details); |
| | | long normalFee = (normalOverdue != null && normalOverdue.getOverdueFee() != null) |
| | | ? normalOverdue.getOverdueFee() : 0L; |
| | | overdueFee = normalFee + driverExceptionFee; |
| | | overdueDays = (normalOverdue != null && normalOverdue.getOverdueDays() != null) |
| | | ? normalOverdue.getOverdueDays() : 0; |
| | | } |
| | | |
| | | order.setConfirmArriveTime(now); |
| | | order.setUpdateTime(now); |
| | | if (overdueFee > 0) { |
| | | order.setOverdueStatus(Constants.ONE); |
| | | order.setOverdueDays(overdueDays); |
| | | order.setOverdueAmount(overdueFee); |
| | | ordersMapper.updateById(order); |
| | | String overdueLogInfo = "é¨åºã" + shopName + "ã确认顾客å°åºï¼é¾æ" + overdueDays |
| | | + "天ï¼é¾æè´¹ç¨" + Constants.getFormatMoney(overdueFee) + "å
"; |
| | | saveShopVerifyLog(order, Constants.OrderLogType.shopConfirmArriveOverdue, overdueLogInfo, null, shopId); |
| | | } else { |
| | | order.setOverdueStatus(Constants.ZERO); |
| | | ordersMapper.updateById(order); |
| | | saveShopVerifyLog(order, Constants.OrderLogType.shopConfirmArrive, |
| | | "é¨åºã" + shopName + "ã确认顾客å°åºï¼æªé¾æ", null, shopId); |
| | | } |
| | | return; |
| | | } |
| | | |
| | | // æ®é订åé¾æè®¡ç® |
| | | OverdueFeeVO overdueInfo = calculateOverdueFeeInternal(order, details); |
| | | |
| | | if (overdueInfo.getOverdue() && overdueInfo.getOverdueDays() > 0) { |
| | | // åå¨é¾æï¼æ è®°é¾æç¶æï¼è®¢åä¿æå½åç¶æ |
| | |
| | | long diffMs = nowCal.getTimeInMillis() - depositCal.getTimeInMillis(); |
| | | int days = (int) (diffMs / (1000 * 60 * 60 * 24)); |
| | | return Math.max(days, 1); |
| | | } |
| | | |
| | | private boolean isSameDay(Date d1, Date d2) { |
| | | if (d1 == null || d2 == null) return false; |
| | | Calendar c1 = Calendar.getInstance(); |
| | | c1.setTime(d1); |
| | | Calendar c2 = Calendar.getInstance(); |
| | | c2.setTime(d2); |
| | | return c1.get(Calendar.YEAR) == c2.get(Calendar.YEAR) |
| | | && c1.get(Calendar.DAY_OF_YEAR) == c2.get(Calendar.DAY_OF_YEAR); |
| | | } |
| | | |
| | | /** |
| | |
| | | |
| | | // æ´æ°è®¢åç¶æä¸ºå·²å®æ |
| | | order.setStatus(Constants.OrderStatus.finished.getStatus()); |
| | | order.setInvoiceStatus(Constants.ONE); |
| | | order.setFinishTime(now); |
| | | order.setUpdateTime(now); |
| | | ordersMapper.updateById(order); |
| | |
| | | Date now = new Date(); |
| | | Date threshold = new Date(now.getTime() + (long) minutes * 60 * 1000); |
| | | // æ¥è¯¢ï¼status=5ãæªéç¥ãå°±å°å¯å or å¼å°(æåä»¶é¨åº)ãé¢è®¡åä»¶æ¶é´å¨ now~threshold ä¹é´ |
| | | SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); |
| | | String nowStr = sdf.format(now); |
| | | String thresholdStr = sdf.format(threshold); |
| | | List<Orders> orders = ordersMapper.selectList(new QueryWrapper<Orders>().lambda() |
| | | .eq(Orders::getStatus, Constants.OrderStatus.arrived.getStatus()) |
| | | .eq(Orders::getPayStatus, Constants.ONE) |
| | |
| | | ) |
| | | .ne(Orders::getPickUpNotifyStatus, Constants.ONE) |
| | | .isNotNull(Orders::getExpectedTakeTime) |
| | | .ge(Orders::getExpectedTakeTime, now) |
| | | .le(Orders::getExpectedTakeTime, threshold)); |
| | | .apply("DATE_FORMAT(EXPECTED_TAKE_TIME, '%Y-%m-%d %H:%i:%s') >= {0}", nowStr) |
| | | .apply("DATE_FORMAT(EXPECTED_TAKE_TIME, '%Y-%m-%d %H:%i:%s') <= {0}", thresholdStr)); |
| | | if (orders == null || orders.isEmpty()) { |
| | | return 0; |
| | | } |
| | |
| | | return distanceKm * 1000 <= radiusM; |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = {Exception.class, BusinessException.class}) |
| | | public void handleOrderException(HandleOrderExceptionDTO dto) { |
| | | // ========== A. æ ¡éª ========== |
| | | Orders original = ordersMapper.selectById(dto.getOrderId()); |
| | | if (original == null || Constants.equalsInteger(original.getDeleted(), Constants.ONE)) { |
| | | throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "订åä¸åå¨"); |
| | | } |
| | | if (!Constants.equalsInteger(original.getType(), Constants.ONE)) { |
| | | throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "ä»
æ¯æå¼å°è®¢åå¼å¸¸å¤ç"); |
| | | } |
| | | if (original.getTakeShopId() != null) { |
| | | throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "该订åå·²å
³èåä»¶é¨åºï¼ä¸æ¯æå¼å¸¸å¤ç"); |
| | | } |
| | | if (!Constants.equalsInteger(original.getStatus(), Constants.FIVE)) { |
| | | throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "ä»
æ¯æå·²éè¾¾ç¶æç订å"); |
| | | } |
| | | if (Constants.equalsInteger(original.getExceptionStatus(), Constants.ONE)) { |
| | | throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "该订åå·²å¤çè¿å¼å¸¸ï¼è¯·å¿é夿ä½"); |
| | | } |
| | | |
| | | ShopInfo newShop = shopInfoMapper.selectById(dto.getDepositShopId()); |
| | | if (newShop == null || Constants.equalsInteger(newShop.getStatus(), Constants.ONE)) { |
| | | throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "åæ¾é¨åºä¸å卿已ç¦ç¨"); |
| | | } |
| | | |
| | | Date now = new Date(); |
| | | |
| | | // ========== B. å建æ°è®¢åï¼å°±å°ååï¼ ========== |
| | | String orderCode = "JC" + new java.text.SimpleDateFormat("yyyyMMddHHmmss").format(now) |
| | | + String.format("%04d", new java.util.Random().nextInt(10000)); |
| | | String orderTradeNo = generateOrderTradeNo(); |
| | | |
| | | // å½å¤©23:30 |
| | | Calendar cal = Calendar.getInstance(); |
| | | cal.set(Calendar.HOUR_OF_DAY, 23); |
| | | cal.set(Calendar.MINUTE, 30); |
| | | cal.set(Calendar.SECOND, 0); |
| | | cal.set(Calendar.MILLISECOND, 0); |
| | | Date expectedTakeTime = cal.getTime(); |
| | | |
| | | // 计ç®åºç¡åä»· |
| | | Long price = 0L; |
| | | Long basicAmount = 0L; |
| | | // æ¥è¯¢å订åæç»è·åç©åå表 |
| | | List<OrdersDetail> originalDetails = ordersDetailMapper.selectList( |
| | | new QueryWrapper<OrdersDetail>().lambda() |
| | | .eq(OrdersDetail::getOrderId, original.getId()) |
| | | .eq(OrdersDetail::getDeleted, Constants.ZERO)); |
| | | if (!CollectionUtils.isEmpty(originalDetails)) { |
| | | CalculateLocalPriceDTO priceDTO = new CalculateLocalPriceDTO(); |
| | | priceDTO.setCityId(Integer.valueOf(original.getCityId())); |
| | | priceDTO.setDepositStartTime(now); |
| | | priceDTO.setDepositEndTime(expectedTakeTime); |
| | | List<OrderItemDTO> items = new ArrayList<>(); |
| | | for (OrdersDetail d : originalDetails) { |
| | | OrderItemDTO item = new OrderItemDTO(); |
| | | item.setCategoryId(d.getLuggageId()); |
| | | item.setQuantity(d.getNum()); |
| | | items.add(item); |
| | | } |
| | | priceDTO.setItems(items); |
| | | PriceCalculateVO priceResult = calculateLocalPrice(priceDTO); |
| | | if (priceResult != null) { |
| | | price = priceResult.getItemPrice(); |
| | | basicAmount = priceResult.getItemPrice(); |
| | | } |
| | | } |
| | | |
| | | // åä»¶é¨åºåæå æ¯ï¼å°±å°ååï¼ |
| | | Integer cityId = Integer.valueOf(original.getCityId()); |
| | | boolean isCompany = Constants.equalsInteger(newShop.getCompanyType(), Constants.ONE); |
| | | int fallbackFieldA = isCompany ? Constants.FIVE : Constants.SIX; |
| | | BigDecimal depositShopFeeRate = getShopRevenueShare(newShop, "localDeposit", cityId, fallbackFieldA); |
| | | |
| | | Orders newOrder = new Orders(); |
| | | newOrder.setCode(orderCode); |
| | | newOrder.setOutTradeNo(orderTradeNo); |
| | | newOrder.setMemberId(original.getMemberId()); |
| | | newOrder.setType(Constants.ZERO); // å°±å°åå |
| | | newOrder.setCityId(original.getCityId()); |
| | | newOrder.setStatus(Constants.ONE); // å¾
å¯å |
| | | newOrder.setPayStatus(Constants.ONE); // å·²æ¯ä» |
| | | newOrder.setPayTime(now); |
| | | newOrder.setCommentStatus(Constants.ZERO); |
| | | newOrder.setSettlementStatus(Constants.ZERO); |
| | | newOrder.setDeleted(Constants.ZERO); |
| | | newOrder.setCreateTime(now); |
| | | newOrder.setUpdateTime(now); |
| | | newOrder.setIsConverted(Constants.ZERO); |
| | | |
| | | // åä»¶ä¿¡æ¯ï¼å
¥åé¨åºï¼ |
| | | newOrder.setDepositShopId(dto.getDepositShopId()); |
| | | newOrder.setDepositLocation(newShop.getAddress()); |
| | | newOrder.setDepositLocationRemark(newShop.getAddress()); |
| | | newOrder.setDepositLat(BigDecimal.valueOf(newShop.getLatitude())); |
| | | newOrder.setDepositLgt(BigDecimal.valueOf(newShop.getLongitude())); |
| | | // åä»¶ä¿¡æ¯ï¼å°±å°=åä»¶é¨åºï¼ |
| | | newOrder.setTakeShopId(dto.getDepositShopId()); |
| | | newOrder.setTakeLocation(newShop.getAddress()); |
| | | newOrder.setTakeLocationRemark(newShop.getAddress()); |
| | | newOrder.setTakeLat(BigDecimal.valueOf(newShop.getLatitude())); |
| | | newOrder.setTakeLgt(BigDecimal.valueOf(newShop.getLongitude())); |
| | | |
| | | // æ¶é´ |
| | | newOrder.setExpectedDepositTime(now); |
| | | newOrder.setExpectedTakeTime(expectedTakeTime); |
| | | newOrder.setEstimatedDepositDays(1); |
| | | |
| | | // ç©åä¿¡æ¯ |
| | | newOrder.setGoodType(original.getGoodType()); |
| | | newOrder.setGoodLevel(original.getGoodLevel()); |
| | | newOrder.setGoodsInfo(original.getGoodsInfo()); |
| | | newOrder.setSupplement(original.getSupplement()); |
| | | newOrder.setSelfTake(original.getSelfTake()); |
| | | newOrder.setTakeUser(original.getTakeUser()); |
| | | newOrder.setTakePhone(original.getTakePhone()); |
| | | |
| | | // å¼å¸¸æ è®° |
| | | newOrder.setExceptionStatus(Constants.ONE); |
| | | newOrder.setRelationOrderId(original.getId()); |
| | | newOrder.setExceptionInfo(dto.getRemark()); |
| | | |
| | | // è´¹ç¨ |
| | | newOrder.setIsUrgent(Constants.ZERO); |
| | | newOrder.setUrgentRata(BigDecimal.ONE); |
| | | newOrder.setUrgentAmount(0L); |
| | | newOrder.setDeclaredAmount(0L); |
| | | newOrder.setDeclaredFee(0L); |
| | | newOrder.setPrice(price); |
| | | newOrder.setBasicAmount(basicAmount); |
| | | newOrder.setEstimatedAmount(basicAmount); |
| | | newOrder.setTotalAmount(0L); |
| | | newOrder.setPayAmount(0L); |
| | | newOrder.setManualRefund(Constants.ZERO); |
| | | |
| | | // è´¹ç¨åé
|
| | | newOrder.setDriverFee(0L); |
| | | newOrder.setDriverFeeRata(BigDecimal.ZERO); |
| | | newOrder.setDepositShopFee(0L); |
| | | newOrder.setDepositShopFeeRata(depositShopFeeRate); |
| | | newOrder.setTakeShopFee(0L); |
| | | newOrder.setTakeShopFeeRata(BigDecimal.ZERO); |
| | | |
| | | // é¨åºè¡¥å¿éé¢ |
| | | newOrder.setShopCompensationAmount(dto.getShopCompensation()); |
| | | |
| | | newOrder.setRemark(dto.getRemark()); |
| | | newOrder.setPlatformSmsNotified(Constants.ZERO); |
| | | newOrder.setMemberVerifyCode(generateVerifyCode()); |
| | | newOrder.setDriverVerifyCode(generateVerifyCode()); |
| | | // 计ç®åºéºè®¢ååºå· |
| | | Date todayStart = DateUtil.getStartOfDay(now); |
| | | Long currentCount = ordersMapper.selectCount(new QueryWrapper<Orders>().lambda() |
| | | .eq(Orders::getDepositShopId, dto.getDepositShopId()) |
| | | .eq(Orders::getPayStatus, Constants.ONE) |
| | | .ge(Orders::getPayTime, todayStart) |
| | | .eq(Orders::getDeleted, Constants.ZERO)); |
| | | newOrder.setAutoNum(currentCount + 1); |
| | | ordersMapper.insert(newOrder); |
| | | |
| | | // ========== C. å建æ°è®¢åæç» ========== |
| | | if (!CollectionUtils.isEmpty(originalDetails)) { |
| | | for (OrdersDetail od : originalDetails) { |
| | | OrdersDetail detail = new OrdersDetail(); |
| | | detail.setOrderId(newOrder.getId()); |
| | | detail.setLuggageId(od.getLuggageId()); |
| | | detail.setLuggageName(od.getLuggageName()); |
| | | detail.setLuggageDetail(od.getLuggageDetail()); |
| | | detail.setNum(od.getNum()); |
| | | detail.setUnitPrice(od.getLocallyPrice()); |
| | | detail.setLocallyPrice(od.getLocallyPrice()); |
| | | detail.setDeleted(Constants.ZERO); |
| | | detail.setCreateTime(now); |
| | | ordersDetailMapper.insert(detail); |
| | | } |
| | | } |
| | | |
| | | // ========== D. æ·è´éä»¶ ========== |
| | | List<Multifile> originalFiles = multifileMapper.selectList( |
| | | new QueryWrapper<Multifile>().lambda() |
| | | .eq(Multifile::getObjId, original.getId()) |
| | | .eq(Multifile::getObjType, Constants.FileType.ORDER_FILE.getKey()) |
| | | .eq(Multifile::getIsdeleted, Constants.ZERO)); |
| | | if (!CollectionUtils.isEmpty(originalFiles)) { |
| | | int sortNum = 1; |
| | | for (Multifile mf : originalFiles) { |
| | | Multifile newFile = new Multifile(); |
| | | newFile.setObjId(newOrder.getId()); |
| | | newFile.setObjType(Constants.FileType.ORDER_FILE.getKey()); |
| | | newFile.setType(mf.getType()); |
| | | newFile.setFileurl(mf.getFileurl()); |
| | | newFile.setIsdeleted(Constants.ZERO); |
| | | newFile.setCreateDate(now); |
| | | newFile.setSortnum(sortNum++); |
| | | multifileMapper.insert(newFile); |
| | | } |
| | | } |
| | | |
| | | // ========== E. æ´æ°å订å ========== |
| | | ordersMapper.update(new UpdateWrapper<Orders>().lambda() |
| | | .set(Orders::getExceptionStatus, Constants.ONE) |
| | | .set(Orders::getExceptionFee, dto.getDriverCompensation()) |
| | | .set(Orders::getUpdateTime, now) |
| | | .eq(Orders::getId, original.getId())); |
| | | |
| | | // ========== F. åéçä¿¡éç¥ ========== |
| | | // 叿ºç«¯-å¼å¸¸æ´¾å |
| | | if (original.getAcceptDriver() != null) { |
| | | DriverInfo driver = driverInfoMapper.selectById(original.getAcceptDriver()); |
| | | if (driver != null && StringUtils.isNotBlank(driver.getTelephone())) { |
| | | sendSmsNotify(driver.getTelephone(), Constants.SmsNotify.EXCEPTION_DISPATCH, |
| | | "orderNo", original.getCode(), |
| | | "address", newShop.getAddress(), |
| | | "code", newOrder.getMemberVerifyCode()); |
| | | } |
| | | } |
| | | // ä¼å端-å¼å¸¸æ´¾å |
| | | String memberPhone = StringUtils.isNotBlank(original.getTakePhone()) ? original.getTakePhone() : null; |
| | | if (memberPhone == null) { |
| | | Member member = memberMapper.selectById(original.getMemberId()); |
| | | if (member != null) { |
| | | memberPhone = member.getTelephone(); |
| | | } |
| | | } |
| | | if (StringUtils.isNotBlank(memberPhone)) { |
| | | sendSmsNotify(memberPhone, Constants.SmsNotify.MEMBER_EXCEPTION_DISPATCH, |
| | | "address", newShop.getAddress()); |
| | | } |
| | | } |
| | | |
| | | } |
| | |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | import java.sql.Driver; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.util.Objects; |
| | | import com.doumee.dao.dto.ShopRevenueQueryDTO; |
| | | import com.doumee.dao.vo.DriverKpiVO; |
| | | import com.doumee.dao.vo.DriverOrderTrendVO; |
| | | import com.doumee.dao.vo.DriverRewardHallVO; |
| | | import com.doumee.biz.system.OperationConfigBiz; |
| | | |
| | | import java.text.SimpleDateFormat; |
| | | import java.util.*; |
| | | import java.util.stream.Collectors; |
| | | |
| | | /** |
| | | * æ¶æ¯è®°å½Serviceå®ç° |
| | |
| | | |
| | | @Autowired |
| | | private DriverInfoMapper driverInfoMapper; |
| | | |
| | | @Autowired |
| | | private OrdersMapper ordersMapper; |
| | | |
| | | @Autowired |
| | | private RewardRecordMapper rewardRecordMapper; |
| | | |
| | | @Autowired |
| | | private OperationConfigBiz operationConfigBiz; |
| | | |
| | | @Override |
| | | public Integer create(Revenue revenue) { |
| | |
| | | return vo; |
| | | } |
| | | |
| | | @Override |
| | | public DriverKpiVO getDriverKpi(Integer driverId, ShopRevenueQueryDTO query) { |
| | | QueryWrapper<Orders> qw = new QueryWrapper<>(); |
| | | qw.lambda() |
| | | .eq(Orders::getDeleted, Constants.ZERO) |
| | | .eq(Orders::getType, Constants.ONE) |
| | | .eq(Orders::getAcceptDriver, driverId) |
| | | .in(Orders::getStatus, |
| | | Constants.OrderStatus.waitDeposit.getKey(), |
| | | Constants.OrderStatus.deposited.getKey(), |
| | | Constants.OrderStatus.accepted.getKey(), |
| | | Constants.OrderStatus.delivering.getKey(), |
| | | Constants.OrderStatus.arrived.getKey(), |
| | | Constants.OrderStatus.finished.getKey()); |
| | | if (query.getStartDate() != null) { |
| | | qw.lambda().ge(Orders::getCreateTime, query.getStartDate()); |
| | | } |
| | | if (query.getEndDate() != null) { |
| | | qw.lambda().le(Orders::getCreateTime, Utils.Date.getEnd(query.getEndDate())); |
| | | } |
| | | List<Orders> orders = ordersMapper.selectList(qw); |
| | | |
| | | DriverKpiVO vo = new DriverKpiVO(); |
| | | vo.setTotalOrderCount(orders.size()); |
| | | |
| | | // æ»å®æè®¢åé |
| | | long finishedCount = orders.stream() |
| | | .filter(o -> Constants.equalsInteger(o.getStatus(), Constants.OrderStatus.finished.getStatus())) |
| | | .count(); |
| | | vo.setFinishedOrderCount((int) finishedCount); |
| | | |
| | | // æ»è¥æ¶éé¢ |
| | | long totalRevenue = orders.stream() |
| | | .mapToLong(o -> { |
| | | long total = o.getTotalAmount() != null ? o.getTotalAmount() : 0L; |
| | | long refund = o.getRefundAmount() != null ? o.getRefundAmount() : 0L; |
| | | return total - refund; |
| | | }).sum(); |
| | | vo.setTotalRevenue(totalRevenue); |
| | | |
| | | // 叿ºåæéé¢ |
| | | long driverFee = orders.stream() |
| | | .mapToLong(o -> o.getDriverFee() != null ? o.getDriverFee() : 0L) |
| | | .sum(); |
| | | vo.setDriverFeeTotal(driverFee); |
| | | |
| | | // 鿬¾åæ° |
| | | long refundCount = orders.stream() |
| | | .filter(o -> o.getRefundAmount() != null && o.getRefundAmount() > 0) |
| | | .count(); |
| | | vo.setRefundOrderCount((int) refundCount); |
| | | |
| | | // è´£ä»»æ£æ¬¾æ»é¢ï¼Revenue memberId=driverId, memberType=1, type=4 |
| | | QueryWrapper<Revenue> revQw = new QueryWrapper<>(); |
| | | revQw.lambda() |
| | | .eq(Revenue::getMemberId, driverId) |
| | | .eq(Revenue::getMemberType, Constants.ONE) |
| | | .eq(Revenue::getType, Constants.FOUR) |
| | | .eq(Revenue::getDeleted, Constants.ZERO); |
| | | if (query.getStartDate() != null) { |
| | | revQw.lambda().ge(Revenue::getCreateTime, query.getStartDate()); |
| | | } |
| | | if (query.getEndDate() != null) { |
| | | revQw.lambda().le(Revenue::getCreateTime, Utils.Date.getEnd(query.getEndDate())); |
| | | } |
| | | List<Revenue> deductRecords = revenueMapper.selectList(revQw); |
| | | long deductTotal = deductRecords.stream() |
| | | .mapToLong(r -> r.getAmount() != null ? r.getAmount() : 0L) |
| | | .sum(); |
| | | vo.setDeductTotal(deductTotal); |
| | | |
| | | return vo; |
| | | } |
| | | |
| | | @Override |
| | | public List<DriverOrderTrendVO> getDriverOrderTrend(Integer driverId) { |
| | | SimpleDateFormat sdf = new SimpleDateFormat("MM/dd"); |
| | | // æå»ºè¿7å¤©æ¥æå表 |
| | | List<String> dateList = new ArrayList<>(); |
| | | for (int i = 6; i >= 0; i--) { |
| | | Calendar c = Calendar.getInstance(); |
| | | c.add(Calendar.DAY_OF_MONTH, -i); |
| | | dateList.add(sdf.format(c.getTime())); |
| | | } |
| | | |
| | | // æ¥è¯¢è¿7天订å |
| | | Calendar startCal = Calendar.getInstance(); |
| | | startCal.add(Calendar.DAY_OF_MONTH, -6); |
| | | startCal.set(Calendar.HOUR_OF_DAY, 0); |
| | | startCal.set(Calendar.MINUTE, 0); |
| | | startCal.set(Calendar.SECOND, 0); |
| | | startCal.set(Calendar.MILLISECOND, 0); |
| | | |
| | | QueryWrapper<Orders> qw = new QueryWrapper<>(); |
| | | qw.lambda() |
| | | .eq(Orders::getDeleted, Constants.ZERO) |
| | | .eq(Orders::getAcceptDriver, driverId) |
| | | .in(Orders::getStatus, |
| | | Constants.OrderStatus.accepted.getKey(), |
| | | Constants.OrderStatus.delivering.getKey(), |
| | | Constants.OrderStatus.arrived.getKey(), |
| | | Constants.OrderStatus.finished.getKey()) |
| | | .ge(Orders::getCreateTime, startCal.getTime()); |
| | | List<Orders> orders = ordersMapper.selectList(qw); |
| | | |
| | | // ææ¥æåç»ç»è®¡ |
| | | Map<String, Long> countMap = orders.stream() |
| | | .collect(Collectors.groupingBy(o -> sdf.format(o.getCreateTime()), Collectors.counting())); |
| | | |
| | | List<DriverOrderTrendVO> result = new ArrayList<>(); |
| | | for (String date : dateList) { |
| | | DriverOrderTrendVO item = new DriverOrderTrendVO(); |
| | | item.setDate(date); |
| | | item.setOrderCount(countMap.getOrDefault(date, 0L).intValue()); |
| | | result.add(item); |
| | | } |
| | | return result; |
| | | } |
| | | |
| | | @Override |
| | | public DriverRewardHallVO getDriverRewardHall(Integer driverId) { |
| | | // æ¥è¯¢å·²é¢åéé¢ï¼status=1ï¼ |
| | | QueryWrapper<RewardRecord> claimedQw = new QueryWrapper<>(); |
| | | claimedQw.select("IFNULL(SUM(AMOUNT), 0) as amount") |
| | | .eq("DRIVER_ID", driverId) |
| | | .eq("STATUS", Constants.ONE) |
| | | .eq("DELETED", Constants.ZERO); |
| | | Map<String, Object> claimedResult = rewardRecordMapper.selectMaps(claimedQw).stream().findFirst().orElse(null); |
| | | long claimedAmount = claimedResult != null && claimedResult.get("amount") != null |
| | | ? Long.parseLong(claimedResult.get("amount").toString()) : 0L; |
| | | |
| | | // æ¥è¯¢å¾
é¢åéé¢ï¼status=0ï¼ |
| | | QueryWrapper<RewardRecord> pendingQw = new QueryWrapper<>(); |
| | | pendingQw.select("IFNULL(SUM(AMOUNT), 0) as amount") |
| | | .eq("DRIVER_ID", driverId) |
| | | .eq("STATUS", Constants.ZERO) |
| | | .eq("DELETED", Constants.ZERO); |
| | | Map<String, Object> pendingResult = rewardRecordMapper.selectMaps(pendingQw).stream().findFirst().orElse(null); |
| | | long pendingAmount = pendingResult != null && pendingResult.get("amount") != null |
| | | ? Long.parseLong(pendingResult.get("amount").toString()) : 0L; |
| | | |
| | | // 读åå¥å±è§åé
ç½® |
| | | com.doumee.dao.dto.OperationConfigDTO config = operationConfigBiz.getConfig(); |
| | | |
| | | // æ¥è¯¢å¥å±è®°å½åè¡¨ï¼æä¸»é®ãå建æ¶é´ååºï¼ |
| | | List<RewardRecord> records = rewardRecordMapper.selectList(new QueryWrapper<RewardRecord>().lambda() |
| | | .eq(RewardRecord::getDriverId, driverId) |
| | | .eq(RewardRecord::getDeleted, Constants.ZERO) |
| | | .orderByAsc(RewardRecord::getId) |
| | | .orderByAsc(RewardRecord::getCreateTime)); |
| | | |
| | | DriverRewardHallVO vo = new DriverRewardHallVO(); |
| | | vo.setClaimedAmount(claimedAmount); |
| | | vo.setPendingAmount(pendingAmount); |
| | | vo.setRegisterRewardOrderCount(config.getRegisterRewardOrderCount()); |
| | | vo.setRegisterRewardAmount(config.getRegisterRewardAmount()); |
| | | vo.setPlatformRewardOrderCount(config.getPlatformRewardOrderCount()); |
| | | vo.setPlatformRewardAmount(config.getPlatformRewardAmount()); |
| | | vo.setRecords(records); |
| | | return vo; |
| | | } |
| | | |
| | | @Override |
| | | public void claimReward(Integer driverId, Integer rewardRecordId) { |
| | | // æ¥è¯¢å¥å±è®°å½ |
| | | RewardRecord record = rewardRecordMapper.selectById(rewardRecordId); |
| | | if (record == null || Constants.equalsInteger(record.getDeleted(), Constants.ONE)) { |
| | | throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "å¥å±è®°å½ä¸åå¨"); |
| | | } |
| | | if (!Constants.equalsInteger(record.getDriverId(), driverId)) { |
| | | throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "æ æé¢å该å¥å±"); |
| | | } |
| | | if (!Constants.equalsInteger(record.getStatus(), Constants.ZERO)) { |
| | | throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "该å¥å±å·²é¢å"); |
| | | } |
| | | |
| | | Long rewardAmount = record.getAmount() != null ? record.getAmount() : 0L; |
| | | if (rewardAmount <= 0) return; |
| | | |
| | | // æ¥è¯¢å¸æºä¿¡æ¯ |
| | | DriverInfo driver = driverInfoMapper.selectById(driverId); |
| | | if (driver == null) { |
| | | throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "叿ºä¿¡æ¯ä¸åå¨"); |
| | | } |
| | | |
| | | // å建æ¶çè®°å½ï¼type=3 å¹³å°å¥å±, optType=1 æ¶å
¥, vaildStatus=1 å·²å
¥è´¦ï¼ |
| | | Revenue revenue = new Revenue(); |
| | | revenue.setMemberId(driver.getMemberId()); |
| | | revenue.setMemberType(Constants.ONE); |
| | | revenue.setType(Constants.THREE); // å¹³å°å¥å± |
| | | revenue.setOptType(Constants.ONE); // æ¶å
¥ |
| | | revenue.setAmount(rewardAmount); |
| | | revenue.setVaildStatus(Constants.ONE); // å·²å
¥è´¦ |
| | | revenue.setObjId(record.getOrderId()); |
| | | revenue.setObjType(Constants.ZERO); |
| | | revenue.setStatus(Constants.ZERO); |
| | | revenue.setDeleted(Constants.ZERO); |
| | | revenue.setCreateTime(new Date()); |
| | | revenueMapper.insert(revenue); |
| | | |
| | | // æ´æ°å¥å±è®°å½ï¼status=1å·²é¢å, claimTime, revenueId |
| | | record.setStatus(Constants.ONE); |
| | | record.setClaimTime(new Date()); |
| | | record.setRevenueId(revenue.getId()); |
| | | record.setUpdateTime(new Date()); |
| | | rewardRecordMapper.updateById(record); |
| | | |
| | | // æ´æ°å¸æºä½é¢ |
| | | driverInfoMapper.update(new UpdateWrapper<DriverInfo>().lambda() |
| | | .setSql("BALANCE = IFNULL(BALANCE, 0) + " + rewardAmount) |
| | | .setSql("TOTAL_BALANCE = IFNULL(TOTAL_BALANCE, 0) + " + rewardAmount) |
| | | .eq(DriverInfo::getId, driverId)); |
| | | } |
| | | |
| | | } |
| | |
| | | import com.doumee.biz.system.AreasBiz; |
| | | import com.doumee.biz.system.SystemDictDataBiz; |
| | | import com.doumee.core.utils.aliyun.AliSmsService; |
| | | import com.doumee.dao.business.CategoryMapper; |
| | | import com.doumee.dao.business.MemberMapper; |
| | | import com.doumee.dao.business.MultifileMapper; |
| | | import com.doumee.dao.business.OrdersMapper; |
| | | import com.doumee.dao.business.PricingRuleMapper; |
| | | import com.doumee.dao.business.RevenueMapper; |
| | | import com.doumee.dao.business.ShopInfoMapper; |
| | | import com.doumee.dao.business.model.Areas; |
| | | import com.doumee.dao.business.model.Category; |
| | | import com.doumee.dao.business.model.Member; |
| | | import com.doumee.dao.business.model.Multifile; |
| | | import com.doumee.dao.business.model.Orders; |
| | | import com.doumee.dao.business.model.PricingRule; |
| | | import com.doumee.dao.business.model.Revenue; |
| | | import com.doumee.dao.business.model.ShopInfo; |
| | | import com.doumee.config.xyy.XyyConfig; |
| | | import com.doumee.config.xyy.dto.AddPrinterRequest; |
| | |
| | | import com.doumee.dao.system.model.SystemDictData; |
| | | import com.doumee.dao.system.SystemUserMapper; |
| | | import com.doumee.dao.system.model.SystemUser; |
| | | import com.doumee.dao.vo.LuggageTypeItem; |
| | | import com.doumee.dao.vo.ShopDetailVO; |
| | | import com.doumee.dao.vo.ShopCenterVO; |
| | | import com.doumee.dao.vo.ShopKpiVO; |
| | | import com.doumee.dao.vo.ShopLoginVO; |
| | | import com.doumee.dao.vo.LocationTagShopCountVO; |
| | | import com.doumee.dao.vo.ShopNearbyVO; |
| | | import com.doumee.dao.vo.ShopSalesStatsVO; |
| | | import com.doumee.dao.vo.ShopWebDetailVO; |
| | | import com.doumee.service.business.AreasService; |
| | | import com.doumee.service.business.DataBoardService; |
| | | import com.doumee.service.business.ShopInfoService; |
| | | import com.doumee.dao.business.SmsrecordMapper; |
| | | import com.doumee.dao.business.model.Smsrecord; |
| | |
| | | |
| | | @Autowired |
| | | private XyyConfig xyyConfig; |
| | | |
| | | @Autowired |
| | | private DataBoardService dataBoardService; |
| | | |
| | | @Autowired |
| | | private RevenueMapper revenueMapper; |
| | | |
| | | @Autowired |
| | | private CategoryMapper categoryMapper; |
| | | |
| | | @Override |
| | | public Integer create(ShopInfo shopInfo) { |
| | | shopInfoMapper.insert(shopInfo); |
| | |
| | | |
| | | // ä¿åæ°åæ´çæ¬éä»¶ |
| | | saveShopAttachments(newChange.getId(), request, now); |
| | | // æ è®°åå²çåæ´çæ¬ä¸ºå é¤ |
| | | shopInfoMapper.update(null, new UpdateWrapper<ShopInfo>().lambda() |
| | | .eq(ShopInfo::getRegionMemberId, member.getId()) |
| | | .eq(ShopInfo::getVersionType, Constants.ONE) |
| | | .eq(ShopInfo::getDeleted, Constants.ZERO) |
| | | .ne(ShopInfo::getId, newChange.getId()) |
| | | .set(ShopInfo::getDeleted, Constants.ONE) |
| | | .set(ShopInfo::getUpdateTime, now)); |
| | | |
| | | } else { |
| | | // ææ°åæ´çæ¬ status=0(å¾
审æ¹) æ 2(被驳å)ï¼ç´æ¥æ´æ° |
| | | String rawPassword = generateDefaultPassword(request.getTelephone()); |
| | |
| | | throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "å½åç¶æä¸å
许审æ¹"); |
| | | } |
| | | |
| | | // 审æ¹éè¿æ¶ï¼æ¶çæ¯ä¾é
ç½®å¿
å¡« |
| | | String revenueShareConfig = null; |
| | | if (Constants.equalsInteger(auditDTO.getAuditStatus(), Constants.ZERO)) { |
| | | if (auditDTO.getLocalDeposit() == null || auditDTO.getRemoteDeposit() == null || auditDTO.getRemoteTake() == null) { |
| | | throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "审æ¹éè¿æ¶æ¶çæ¯ä¾é
ç½®ä¸è½ä¸ºç©º"); |
| | | } |
| | | JSONObject json = new JSONObject(); |
| | | json.put("localDeposit", auditDTO.getLocalDeposit()); |
| | | json.put("remoteDeposit", auditDTO.getRemoteDeposit()); |
| | | json.put("remoteTake", auditDTO.getRemoteTake()); |
| | | revenueShareConfig = json.toJSONString(); |
| | | } |
| | | |
| | | Date now = new Date(); |
| | | // auditDTO.auditStatus: 0=éè¿ â 1, 1=驳å â 2 |
| | | Integer newAuditStatus = Constants.equalsInteger(auditDTO.getAuditStatus(), Constants.ZERO) ? Constants.ONE : Constants.TWO; |
| | |
| | | changeVersion.setUpdateTime(now); |
| | | |
| | | if (Constants.equalsInteger(newAuditStatus, Constants.ONE)) { |
| | | changeVersion.setRevenueShareConfig(revenueShareConfig); |
| | | validateCityAndSetDeposit(changeVersion); |
| | | } |
| | | shopInfoMapper.updateById(changeVersion); |
| | |
| | | official.setUpdateTime(now); |
| | | if (Constants.equalsInteger(newAuditStatus, Constants.ONE)) { |
| | | official.setDepositAmount(changeVersion.getDepositAmount()); |
| | | official.setRevenueShareConfig(revenueShareConfig); |
| | | } |
| | | shopInfoMapper.updateById(official); |
| | | } |
| | |
| | | changeVersion.setAuditTime(now); |
| | | changeVersion.setAuditRemark(auditDTO.getAuditRemark()); |
| | | changeVersion.setAuditUserId(auditDTO.getAuditUser()); |
| | | changeVersion.setRevenueShareConfig(revenueShareConfig); |
| | | changeVersion.setUpdateTime(now); |
| | | shopInfoMapper.updateById(changeVersion); |
| | | |
| | | // æ è®°åå²çåæ´çæ¬ä¸ºå é¤ |
| | | shopInfoMapper.update(null, new UpdateWrapper<ShopInfo>().lambda() |
| | | .eq(ShopInfo::getRegionMemberId, changeVersion.getRegionMemberId()) |
| | | .eq(ShopInfo::getVersionType, Constants.ONE) |
| | | .eq(ShopInfo::getDeleted, Constants.ZERO) |
| | | .ne(ShopInfo::getId, changeVersion.getId()) |
| | | .ne(ShopInfo::getId, officialId) |
| | | .set(ShopInfo::getDeleted, Constants.ONE) |
| | | .set(ShopInfo::getUpdateTime, now)); |
| | | |
| | | // åæ¥åæ´çæ¬æ°æ®å°æ£å¼çæ¬ |
| | | syncChangeToOfficial(changeVersion, official, now); |
| | |
| | | shopInfo.setAliAccount(request.getAliAccount()); |
| | | shopInfo.setAliName(request.getAliName()); |
| | | shopInfo.setRevenueShareConfig(buildRevenueShareConfig(request.getLocalDeposit(), request.getRemoteDeposit(), request.getRemoteTake())); |
| | | shopInfo.setLocationTagIds(request.getLocationTagIds()); |
| | | shopInfo.setUpdateTime(now); |
| | | shopInfoMapper.updateById(shopInfo); |
| | | |
| | |
| | | vo.setDeliveryRange(shopInfo.getDeliveryArea()); |
| | | vo.setVersionType(shopInfo.getVersionType()); |
| | | vo.setRelationShopId(shopInfo.getRelationShopId()); |
| | | vo.setLocationTagIds(shopInfo.getLocationTagIds()); |
| | | |
| | | // ä½ç½®æ ç¾åç§° |
| | | if (StringUtils.isNotBlank(shopInfo.getLocationTagIds())) { |
| | | List<String> tagNames = new ArrayList<>(); |
| | | for (String tagId : shopInfo.getLocationTagIds().split(",")) { |
| | | Category tag = categoryMapper.selectById(Integer.valueOf(tagId.trim())); |
| | | if (tag != null) { |
| | | tagNames.add(tag.getName()); |
| | | } |
| | | } |
| | | vo.setLocationTagNames(String.join(",", tagNames)); |
| | | } |
| | | // è§£ææ¶çæ¯ä¾é
ç½® |
| | | if (StringUtils.isNotBlank(shopInfo.getRevenueShareConfig())) { |
| | | try { |
| | |
| | | vo.setIdcardImgBackUrl(StringUtils.isNotBlank(shopInfo.getIdcardImgBack()) ? imgPrefix + shopInfo.getIdcardImgBack() : null); |
| | | vo.setBusinessImg(shopInfo.getBusinessImg()); |
| | | vo.setBusinessImgUrl(StringUtils.isNotBlank(shopInfo.getBusinessImg()) ? imgPrefix + shopInfo.getBusinessImg() : null); |
| | | vo.setCoverImg(shopInfo.getCoverImg()); |
| | | vo.setCoverImgUrl(StringUtils.isNotBlank(shopInfo.getCoverImg()) ? imgPrefix + shopInfo.getCoverImg() : null); |
| | | vo.setContent(shopInfo.getContent()); |
| | | vo.setDepositTypes(shopInfo.getDepositTypes()); |
| | | vo.setFeeStandard(shopInfo.getFeeStandard()); |
| | | vo.setShopHours(shopInfo.getShopHours()); |
| | | vo.setBusinessType(shopInfo.getBusinessType()); |
| | | |
| | | // æ¥è¯¢éä»¶ |
| | | QueryWrapper<Multifile> fileQw = new QueryWrapper<>(); |
| | |
| | | "SELECT id FROM areas WHERE parent_id = " + dto.getCityId() + " AND isdeleted = 0"); |
| | | } |
| | | |
| | | // ä½ç½®æ ç¾çé |
| | | if (dto.getLocationTagId() != null) { |
| | | qw.apply("FIND_IN_SET({0}, LOCATION_TAG_IDS) > 0", dto.getLocationTagId()); |
| | | } |
| | | |
| | | // è·ç¦»çéï¼åä½ï¼ç±³ â 转æ¢ä¸ºkmæ¯è¾ï¼ |
| | | if (distanceMeter != null && distanceMeter > 0) { |
| | | double maxKm = distanceMeter / 1000.0; |
| | |
| | | vo.setLongitude(shop.getLongitude()); |
| | | // é¨å¤´ç
§ç¬¬ä¸å¼ |
| | | vo.setCoverImg(getFirstImage(shop.getId(), Constants.FileType.STORE_FRONT.getKey(), imgPrefix)); |
| | | // ä½ç½®æ ç¾åç§° |
| | | vo.setLocationTagNames(resolveLocationTagNames(shop.getLocationTagIds())); |
| | | // è·ç¦» |
| | | if (longitude != null && latitude != null && shop.getLongitude() != null && shop.getLatitude() != null) { |
| | | double distKm = haversine(latitude, longitude, shop.getLatitude(), shop.getLongitude()); |
| | |
| | | pageData.setPage(result.getCurrent()); |
| | | pageData.setCapacity(result.getSize()); |
| | | return pageData; |
| | | } |
| | | |
| | | @Override |
| | | public List<LocationTagShopCountVO> countShopsByLocationTag(Integer cityId) { |
| | | // æ¥è¯¢ææä½ç½®æ ç¾ |
| | | List<Category> tags = categoryMapper.selectList(new QueryWrapper<Category>().lambda() |
| | | .eq(Category::getDeleted, Constants.ZERO) |
| | | .eq(Category::getStatus, Constants.ZERO) |
| | | .eq(Category::getType, Constants.FIVE) |
| | | .orderByAsc(Category::getSortnum)); |
| | | if (tags.isEmpty()) { |
| | | return new ArrayList<>(); |
| | | } |
| | | |
| | | // æå»ºé¨åºåºç¡æ¥è¯¢æ¡ä»¶ |
| | | QueryWrapper<ShopInfo> baseQw = new QueryWrapper<>(); |
| | | baseQw.lambda() |
| | | .eq(ShopInfo::getDeleted, Constants.ZERO) |
| | | .eq(ShopInfo::getStatus, Constants.ZERO) |
| | | .eq(ShopInfo::getVersionType, Constants.ZERO) |
| | | .eq(ShopInfo::getAuditStatus, Constants.THREE); |
| | | if (cityId != null) { |
| | | baseQw.inSql("AREA_ID", |
| | | "SELECT id FROM areas WHERE parent_id = " + cityId + " AND isdeleted = 0"); |
| | | } |
| | | |
| | | // ææ ç¾ç»è®¡ |
| | | List<LocationTagShopCountVO> result = new ArrayList<>(); |
| | | for (Category tag : tags) { |
| | | QueryWrapper<ShopInfo> qw = baseQw.clone(); |
| | | qw.apply("FIND_IN_SET({0}, LOCATION_TAG_IDS) > 0", tag.getId()); |
| | | Long count = shopInfoMapper.selectCount(qw); |
| | | LocationTagShopCountVO vo = new LocationTagShopCountVO(); |
| | | vo.setTagId(tag.getId()); |
| | | vo.setTagName(tag.getName()); |
| | | vo.setShopCount(count != null ? count.intValue() : 0); |
| | | result.add(vo); |
| | | } |
| | | |
| | | // æ»æ°æ¾å¨å表第ä¸ä¸ª |
| | | Long totalCount = shopInfoMapper.selectCount(baseQw); |
| | | LocationTagShopCountVO totalVo = new LocationTagShopCountVO(); |
| | | totalVo.setTagId(null); |
| | | totalVo.setTagName("å¯åç¹æ»æ°"); |
| | | totalVo.setShopCount(totalCount != null ? totalCount.intValue() : 0); |
| | | result.add(0, totalVo); |
| | | return result; |
| | | } |
| | | |
| | | @Override |
| | |
| | | vo.setLatitude(shop.getLatitude()); |
| | | vo.setLongitude(shop.getLongitude()); |
| | | vo.setLinkPhone(shop.getLinkPhone()); |
| | | vo.setLocationTagNames(resolveLocationTagNames(shop.getLocationTagIds())); |
| | | |
| | | // é¨å¤´ç
§ + å
é¨ç
§ å
¨è·¯å¾éå |
| | | String imgPrefix = getShopPrefix(); |
| | |
| | | /** |
| | | * è·åé¨åºå¾çåç¼ |
| | | */ |
| | | private String resolveLocationTagNames(String locationTagIds) { |
| | | if (StringUtils.isBlank(locationTagIds)) return null; |
| | | List<String> tagNames = new ArrayList<>(); |
| | | for (String tagId : locationTagIds.split(",")) { |
| | | Category tag = categoryMapper.selectById(Integer.valueOf(tagId.trim())); |
| | | if (tag != null) { |
| | | tagNames.add(tag.getName()); |
| | | } |
| | | } |
| | | return tagNames.isEmpty() ? null : String.join(",", tagNames); |
| | | } |
| | | |
| | | private String getShopPrefix() { |
| | | try { |
| | | return systemDictDataBiz.queryByCode(Constants.OSS, Constants.RESOURCE_PATH).getCode() |
| | |
| | | return vo; |
| | | } |
| | | |
| | | @Override |
| | | public List<LuggageTypeItem> shopLuggageTypeList(Integer shopId, ShopRevenueQueryDTO query) { |
| | | QueryWrapper<Orders> qw = new QueryWrapper<>(); |
| | | qw.lambda() |
| | | .eq(Orders::getDeleted, Constants.ZERO) |
| | | .in(Orders::getStatus, |
| | | Constants.OrderStatus.waitDeposit.getKey(), |
| | | Constants.OrderStatus.deposited.getKey(), |
| | | Constants.OrderStatus.accepted.getKey(), |
| | | Constants.OrderStatus.delivering.getKey(), |
| | | Constants.OrderStatus.arrived.getKey(), |
| | | Constants.OrderStatus.finished.getKey()) |
| | | .and(w -> w.eq(Orders::getDepositShopId, shopId).or().eq(Orders::getTakeShopId, shopId)); |
| | | if (query.getStartDate() != null) { |
| | | qw.lambda().ge(Orders::getCreateTime, query.getStartDate()); |
| | | } |
| | | if (query.getEndDate() != null) { |
| | | qw.lambda().le(Orders::getCreateTime, Utils.Date.getEnd(query.getEndDate())); |
| | | } |
| | | List<Orders> orders = ordersMapper.selectList(qw); |
| | | List<Integer> orderIds = orders.stream().map(Orders::getId).collect(Collectors.toList()); |
| | | return dataBoardService.buildLuggageTypeList(orderIds); |
| | | } |
| | | |
| | | @Override |
| | | public ShopKpiVO getShopKpi(Integer shopId, ShopRevenueQueryDTO query) { |
| | | // æ¥è¯¢é¨åºåä¸ç订åï¼ç¶æ1-7ï¼æ¥æèå´ï¼ |
| | | QueryWrapper<Orders> qw = new QueryWrapper<>(); |
| | | qw.lambda() |
| | | .eq(Orders::getDeleted, Constants.ZERO) |
| | | .in(Orders::getStatus, |
| | | Constants.OrderStatus.waitDeposit.getKey(), |
| | | Constants.OrderStatus.deposited.getKey(), |
| | | Constants.OrderStatus.accepted.getKey(), |
| | | Constants.OrderStatus.delivering.getKey(), |
| | | Constants.OrderStatus.arrived.getKey(), |
| | | Constants.OrderStatus.finished.getKey()) |
| | | .and(w -> w.eq(Orders::getDepositShopId, shopId).or().eq(Orders::getTakeShopId, shopId)); |
| | | if (query.getStartDate() != null) { |
| | | qw.lambda().ge(Orders::getCreateTime, query.getStartDate()); |
| | | } |
| | | if (query.getEndDate() != null) { |
| | | qw.lambda().le(Orders::getCreateTime, Utils.Date.getEnd(query.getEndDate())); |
| | | } |
| | | List<Orders> orders = ordersMapper.selectList(qw); |
| | | |
| | | ShopKpiVO vo = new ShopKpiVO(); |
| | | |
| | | // å¯å订åéï¼å°±å°ï¼ |
| | | long localCount = orders.stream().filter(o -> Constants.equalsInteger(o.getType(), Constants.ZERO)).count(); |
| | | vo.setLocalOrderCount((int) localCount); |
| | | |
| | | // å¯é订åéï¼å¼å°ï¼ |
| | | long remoteCount = orders.stream().filter(o -> Constants.equalsInteger(o.getType(), Constants.ONE)).count(); |
| | | vo.setRemoteOrderCount((int) remoteCount); |
| | | |
| | | // æ»è®¢åé |
| | | vo.setTotalOrderCount(orders.size()); |
| | | |
| | | // æ»å®æè®¢åé |
| | | long finishedCount = orders.stream() |
| | | .filter(o -> Constants.equalsInteger(o.getStatus(), Constants.OrderStatus.finished.getStatus())) |
| | | .count(); |
| | | vo.setFinishedOrderCount((int) finishedCount); |
| | | |
| | | // æ»è¥æ¶éé¢ = sum(totalAmount - refundAmount) |
| | | long totalRevenue = orders.stream() |
| | | .mapToLong(o -> { |
| | | long total = o.getTotalAmount() != null ? o.getTotalAmount() : 0L; |
| | | long refund = o.getRefundAmount() != null ? o.getRefundAmount() : 0L; |
| | | return total - refund; |
| | | }).sum(); |
| | | vo.setTotalRevenue(totalRevenue); |
| | | |
| | | // é¨åºåæéé¢ |
| | | long shopFee = 0L; |
| | | for (Orders o : orders) { |
| | | if (Constants.equalsInteger(o.getType(), Constants.ZERO)) { |
| | | // å°±å°å¯åï¼ååä»¶é¨åºåæ |
| | | if (Constants.equalsInteger(o.getDepositShopId(), shopId)) { |
| | | shopFee += o.getDepositShopFee() != null ? o.getDepositShopFee() : 0L; |
| | | } |
| | | } else if (Constants.equalsInteger(o.getType(), Constants.ONE)) { |
| | | // å¼å°ï¼ä½ä¸ºåä»¶é¨åºådepositShopFeeï¼ä½ä¸ºåä»¶é¨åºåtakeShopFee |
| | | if (Constants.equalsInteger(o.getDepositShopId(), shopId)) { |
| | | shopFee += o.getDepositShopFee() != null ? o.getDepositShopFee() : 0L; |
| | | } |
| | | if (Constants.equalsInteger(o.getTakeShopId(), shopId)) { |
| | | shopFee += o.getTakeShopFee() != null ? o.getTakeShopFee() : 0L; |
| | | } |
| | | } |
| | | } |
| | | vo.setShopFeeTotal(shopFee); |
| | | |
| | | // 鿬¾åæ° |
| | | long refundCount = orders.stream() |
| | | .filter(o -> o.getRefundAmount() != null && o.getRefundAmount() > 0) |
| | | .count(); |
| | | vo.setRefundOrderCount((int) refundCount); |
| | | |
| | | // è´£ä»»æ£æ¬¾æ»é¢ï¼Revenue memberId=shopId, memberType=2, type=4 |
| | | QueryWrapper<Revenue> revQw = new QueryWrapper<>(); |
| | | revQw.lambda() |
| | | .eq(Revenue::getMemberId, shopId) |
| | | .eq(Revenue::getMemberType, Constants.TWO) |
| | | .eq(Revenue::getType, Constants.FOUR) |
| | | .eq(Revenue::getDeleted, Constants.ZERO); |
| | | if (query.getStartDate() != null) { |
| | | revQw.lambda().ge(Revenue::getCreateTime, query.getStartDate()); |
| | | } |
| | | if (query.getEndDate() != null) { |
| | | revQw.lambda().le(Revenue::getCreateTime, Utils.Date.getEnd(query.getEndDate())); |
| | | } |
| | | List<Revenue> deductRecords = revenueMapper.selectList(revQw); |
| | | long deductTotal = deductRecords.stream() |
| | | .mapToLong(r -> r.getAmount() != null ? r.getAmount() : 0L) |
| | | .sum(); |
| | | vo.setDeductTotal(deductTotal); |
| | | |
| | | return vo; |
| | | } |
| | | |
| | | /** |
| | | * åæ·è´¦å·å¯ç ç»å½ |
| | | * @param dto |
| | |
| | | package com.doumee.service.common; |
| | | |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.beans.factory.annotation.Value; |
| | | import org.springframework.context.annotation.AnnotationConfigApplicationContext; |
| | | import org.springframework.core.io.FileSystemResource; |
| | | import org.springframework.mail.SimpleMailMessage; |
| | | import org.springframework.mail.javamail.JavaMailSender; |
| | | import org.springframework.mail.javamail.MimeMessageHelper; |
| | | import org.springframework.stereotype.Service; |
| | |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | | @Slf4j |
| | | @Service |
| | | public class EmailService { |
| | | |
| | | @Autowired |
| | | private JavaMailSender javaMailSender;//注å
¥JavaMailSender |
| | | private JavaMailSender javaMailSender; |
| | | |
| | | @Value("${spring.mail.username}") |
| | | private String fromEmail; |
| | | public boolean sendEmailWithLocalFiles(String toEmail, String title, String content, List<Map<String,Object>> fileList) { |
| | | |
| | | /** |
| | | * åéçº¯ææ¬é®ä»¶ |
| | | */ |
| | | public boolean sendText(String toEmail, String subject, String text) { |
| | | try { |
| | | AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); |
| | | context.refresh(); |
| | | MimeMessage message = javaMailSender.createMimeMessage(); |
| | | MimeMessageHelper helper = new MimeMessageHelper(message, true); |
| | | helper.setTo(toEmail); |
| | | helper.setFrom(fromEmail); |
| | | helper.setSubject(title); |
| | | helper.setText(content); |
| | | if(fileList!=null){ |
| | | for (Map<String,Object> f : fileList){ |
| | | // 设置éä»¶ |
| | | helper.addAttachment((String) f.get("name"),new FileSystemResource((File) f.get("file"))); |
| | | } |
| | | } |
| | | SimpleMailMessage message = new SimpleMailMessage(); |
| | | message.setTo(toEmail); |
| | | message.setFrom(fromEmail); |
| | | message.setSubject(subject); |
| | | message.setText(text); |
| | | javaMailSender.send(message); |
| | | System.out.println("é®ä»¶åéæåï¼"); |
| | | return true; |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | return false; |
| | | } |
| | | } |
| | | public boolean sendEmailWithImages(String toEmail, String title, Map<String,String> contentForm, List<String> imgList) { |
| | | try { |
| | | AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); |
| | | context.refresh(); |
| | | MimeMessage message = javaMailSender.createMimeMessage(); |
| | | MimeMessageHelper helper = new MimeMessageHelper(message, true); |
| | | helper.setTo(toEmail); |
| | | helper.setFrom(fromEmail); |
| | | helper.setSubject(title); |
| | | String content = "<html><body>"; |
| | | if(contentForm!=null){ |
| | | for (Map.Entry<String, String> f : contentForm.entrySet()) { |
| | | // 设置éä»¶ |
| | | content += "<div style='display:block;'>"+f.getKey()+"ï¼"+f.getValue()+"</p>"; |
| | | } |
| | | } |
| | | if(imgList!=null){ |
| | | content += "<div style='display:block;'> "; |
| | | for (String f : imgList){ |
| | | // 设置éä»¶ |
| | | content += "<a href='"+f+"' target='blank'><img style='width:200px;margin:5px' src='"+f+"'/></a>"; |
| | | } |
| | | } |
| | | content += "</div></body><html>"; |
| | | helper.setText(content,true); |
| | | javaMailSender.send(message); |
| | | System.out.println("é®ä»¶åéæåï¼"); |
| | | return true; |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | return false; |
| | | } |
| | | } |
| | | log.info("çº¯ææ¬é®ä»¶åéæå: to={}", toEmail); |
| | | return true; |
| | | } catch (Exception e) { |
| | | log.error("çº¯ææ¬é®ä»¶åé失败: to={}, error={}", toEmail, e.getMessage()); |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * åéHTMLé®ä»¶ |
| | | */ |
| | | public boolean sendHtml(String toEmail, String subject, String html) { |
| | | try { |
| | | MimeMessage message = javaMailSender.createMimeMessage(); |
| | | MimeMessageHelper helper = new MimeMessageHelper(message, true); |
| | | helper.setTo(toEmail); |
| | | helper.setFrom(fromEmail); |
| | | helper.setSubject(subject); |
| | | helper.setText(html, true); |
| | | javaMailSender.send(message); |
| | | log.info("HTMLé®ä»¶åéæå: to={}", toEmail); |
| | | return true; |
| | | } catch (Exception e) { |
| | | log.error("HTMLé®ä»¶åé失败: to={}, error={}", toEmail, e.getMessage()); |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * åé带éä»¶é®ä»¶ |
| | | * @param fileList éä»¶åè¡¨ï¼æ¯ä¸ªMapå
å« name(æä»¶å) å file(File对象) |
| | | */ |
| | | public boolean sendWithAttachment(String toEmail, String subject, String text, List<Map<String, Object>> fileList) { |
| | | try { |
| | | MimeMessage message = javaMailSender.createMimeMessage(); |
| | | MimeMessageHelper helper = new MimeMessageHelper(message, true); |
| | | helper.setTo(toEmail); |
| | | helper.setFrom(fromEmail); |
| | | helper.setSubject(subject); |
| | | helper.setText(text); |
| | | if (fileList != null) { |
| | | for (Map<String, Object> f : fileList) { |
| | | helper.addAttachment((String) f.get("name"), new FileSystemResource((File) f.get("file"))); |
| | | } |
| | | } |
| | | javaMailSender.send(message); |
| | | log.info("éä»¶é®ä»¶åéæå: to={}", toEmail); |
| | | return true; |
| | | } catch (Exception e) { |
| | | log.error("éä»¶é®ä»¶åé失败: to={}, error={}", toEmail, e.getMessage()); |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * åé带å
åµå¾ççHTMLé®ä»¶ |
| | | * @param contentForm 表åå
容é®å¼å¯¹ |
| | | * @param imgList å¾çURLå表 |
| | | */ |
| | | public boolean sendWithInlineImage(String toEmail, String subject, Map<String, String> contentForm, List<String> imgList) { |
| | | try { |
| | | MimeMessage message = javaMailSender.createMimeMessage(); |
| | | MimeMessageHelper helper = new MimeMessageHelper(message, true); |
| | | helper.setTo(toEmail); |
| | | helper.setFrom(fromEmail); |
| | | helper.setSubject(subject); |
| | | StringBuilder content = new StringBuilder("<html><body>"); |
| | | if (contentForm != null) { |
| | | for (Map.Entry<String, String> entry : contentForm.entrySet()) { |
| | | content.append("<div style='display:block;'>").append(entry.getKey()).append("ï¼").append(entry.getValue()).append("</div>"); |
| | | } |
| | | } |
| | | if (imgList != null) { |
| | | content.append("<div style='display:block;'>"); |
| | | for (String img : imgList) { |
| | | content.append("<a href='").append(img).append("' target='blank'><img style='width:200px;margin:5px' src='").append(img).append("'/></a>"); |
| | | } |
| | | content.append("</div>"); |
| | | } |
| | | content.append("</body></html>"); |
| | | helper.setText(content.toString(), true); |
| | | javaMailSender.send(message); |
| | | log.info("å¾çé®ä»¶åéæå: to={}", toEmail); |
| | | return true; |
| | | } catch (Exception e) { |
| | | log.error("å¾çé®ä»¶åé失败: to={}, error={}", toEmail, e.getMessage()); |
| | | return false; |
| | | } |
| | | } |
| | | } |
| | |
| | | # enable: true |
| | | # required: true |
| | | mail: |
| | | host: smtp.exmail.qq.com |
| | | username: jp@doumee.com |
| | | password: 2Jz9HFW2U7vRnCRu |
| | | host: smtp.qq.com |
| | | port: 465 |
| | | username: 1171472578@qq.com |
| | | password: bxecisqcmdauibgb |
| | | default-encoding: UTF-8 |
| | | properties: |
| | | mail: |
| | | smtp: |
| | | auth: true |
| | | starttls: |
| | | enable: true |
| | | required: true |
| | | ssl: |
| | | enable: true |
| | | trust: smtp.qq.com |
| | | socketFactory: |
| | | class: javax.net.ssl.SSLSocketFactory |
| | | port: 465 |
| | | |
| | | debug_model: true |
| | | |
| | |
| | | time-zone: GMT+8 |
| | | date-format: yyyy-MM-dd HH:mm:ss |
| | | mail: |
| | | host: smtp.aliyun.com |
| | | host: smtp.qq.com |
| | | port: 465 |
| | | username: your_email@aliyun.com |
| | | password: your_password |
| | | username: 1171472578@qq.com |
| | | password: bxecisqcmdauibgb |
| | | default-encoding: UTF-8 |
| | | properties: |
| | | mail: |
| | | smtp: |
| | | auth: true |
| | | starttls: |
| | | enable: true |
| | | required: true |
| | | ssl: |
| | | enable: true |
| | | trust: smtp.qq.com |
| | | socketFactory: |
| | | class: javax.net.ssl.SSLSocketFactory |
| | | port: 465 |
| | | debug_model: false |
| | | ########################æå
æ¨éé
ç½®######################## |
| | | jpush: |
| | |
| | | # enable: true |
| | | # required: true |
| | | mail: |
| | | host: smtp.exmail.qq.com |
| | | username: jp@doumee.com |
| | | password: 2Jz9HFW2U7vRnCRu |
| | | host: smtp.qq.com |
| | | port: 465 |
| | | username: 1171472578@qq.com |
| | | password: bxecisqcmdauibgb |
| | | default-encoding: UTF-8 |
| | | properties: |
| | | mail: |
| | | smtp: |
| | | auth: true |
| | | starttls: |
| | | enable: true |
| | | required: true |
| | | ssl: |
| | | enable: true |
| | | trust: smtp.qq.com |
| | | socketFactory: |
| | | class: javax.net.ssl.SSLSocketFactory |
| | | port: 465 |
| | | |
| | | debug_model: true |
| | | |
| | |
| | | @ApiOperation(value = "计ç®å°±å°ååé¢ä¼°è´¹ç¨", notes = "æ ¹æ®åå¸ã天æ°ãç©åç±»ååæ°é计ç®å°±å°ååé¢ä¼°è´¹ç¨") |
| | | @PostMapping("/calculateLocalPrice") |
| | | public ApiResponse<PriceCalculateVO> calculateLocalPrice(@RequestBody @Valid CalculateLocalPriceDTO dto) { |
| | | dto.setMemberId(getMemberId()); |
| | | return ApiResponse.success("æä½æå", ordersService.calculateLocalPrice(dto)); |
| | | } |
| | | |
| | |
| | | @ApiOperation(value = "计ç®å¼å°ååé¢ä¼°è´¹ç¨", notes = "æ ¹æ®è·ç¦»ãç©åç±»ååæ°é计ç®å¼å°ååé¢ä¼°è´¹ç¨") |
| | | @PostMapping("/calculateRemotePrice") |
| | | public ApiResponse<PriceCalculateVO> calculateRemotePrice(@RequestBody @Valid CalculateRemotePriceDTO dto) { |
| | | dto.setMemberId(getMemberId()); |
| | | return ApiResponse.success("æä½æå", ordersService.calculateRemotePrice(dto)); |
| | | } |
| | | |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.doumee.api.web; |
| | | |
| | | import com.doumee.core.annotation.LoginRequired; |
| | | import com.doumee.core.annotation.trace.Trace; |
| | | import com.doumee.core.model.ApiResponse; |
| | | import com.doumee.core.model.PageData; |
| | | import com.doumee.core.model.PageWrap; |
| | | import com.doumee.dao.business.model.InvoiceRecord; |
| | | import com.doumee.dao.dto.ApplyInvoiceDTO; |
| | | import com.doumee.dao.dto.SendInvoiceEmailDTO; |
| | | import com.doumee.service.business.InvoiceRecordService; |
| | | import io.swagger.annotations.Api; |
| | | import io.swagger.annotations.ApiImplicitParam; |
| | | import io.swagger.annotations.ApiImplicitParams; |
| | | import io.swagger.annotations.ApiOperation; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.validation.annotation.Validated; |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | | import javax.validation.Valid; |
| | | |
| | | /** |
| | | * 订åå票 |
| | | * |
| | | * @Author : Rk |
| | | * @create 2026/5/18 9:42 |
| | | */ |
| | | @Api(tags = "订åå票") |
| | | @Trace(exclude = true) |
| | | @RestController |
| | | @RequestMapping("/web/invoice") |
| | | @Slf4j |
| | | public class InvoiceApi extends ApiController { |
| | | |
| | | @Autowired |
| | | private InvoiceRecordService invoiceRecordService; |
| | | |
| | | @LoginRequired |
| | | @ApiOperation("å¼ç¥¨ç³è¯·") |
| | | @PostMapping("/apply") |
| | | @ApiImplicitParams({ |
| | | @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "ç¨æ·tokenå¼", required = true) |
| | | }) |
| | | public ApiResponse<String> apply(@RequestBody @Valid ApplyInvoiceDTO dto) { |
| | | invoiceRecordService.applyInvoice(dto, getMemberId()); |
| | | return ApiResponse.success("ç³è¯·æå"); |
| | | } |
| | | |
| | | @LoginRequired |
| | | @ApiOperation("å¼ç¥¨è®°å½å页") |
| | | @PostMapping("/page") |
| | | @ApiImplicitParams({ |
| | | @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "ç¨æ·tokenå¼", required = true) |
| | | }) |
| | | public ApiResponse<PageData<InvoiceRecord>> page(@RequestBody @Validated PageWrap<InvoiceRecord> pageWrap) { |
| | | return ApiResponse.success("æ¥è¯¢æå", invoiceRecordService.findMemberInvoicePage(pageWrap, getMemberId())); |
| | | } |
| | | |
| | | @LoginRequired |
| | | @ApiOperation("åéå票é®ä»¶") |
| | | @PostMapping("/sendEmail") |
| | | @ApiImplicitParams({ |
| | | @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "ç¨æ·tokenå¼", required = true) |
| | | }) |
| | | public ApiResponse<String> sendEmail(@RequestBody @Valid SendInvoiceEmailDTO dto) { |
| | | invoiceRecordService.sendInvoiceEmail(getMemberId(), dto.getInvoiceRecordId(), dto.getEmail()); |
| | | return ApiResponse.success("åéæå"); |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.doumee.api.web; |
| | | |
| | | import com.doumee.core.annotation.LoginRequired; |
| | | import com.doumee.core.model.ApiResponse; |
| | | import com.doumee.core.model.PageData; |
| | | import com.doumee.core.model.PageWrap; |
| | | import com.doumee.dao.business.model.MemberCoupon; |
| | | import com.doumee.service.business.MemberCouponService; |
| | | import io.swagger.annotations.Api; |
| | | import io.swagger.annotations.ApiImplicitParam; |
| | | import io.swagger.annotations.ApiImplicitParams; |
| | | import io.swagger.annotations.ApiOperation; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | | @Slf4j |
| | | @Api(tags = "ä¼å伿 å¸") |
| | | @RestController |
| | | @RequestMapping("/web/memberCoupon") |
| | | public class MemberCouponApi extends ApiController { |
| | | |
| | | @Autowired |
| | | private MemberCouponService memberCouponService; |
| | | |
| | | @LoginRequired |
| | | @ApiOperation(value = "ä¼å伿 å¸å表", notes = "å°ç¨åºç«¯") |
| | | @PostMapping("/findPage") |
| | | @ApiImplicitParams({ |
| | | @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "ç¨æ·tokenå¼", required = true), |
| | | }) |
| | | public ApiResponse<PageData<MemberCoupon>> findPage(@RequestBody PageWrap<MemberCoupon> pageWrap) { |
| | | Integer status = pageWrap.getModel() != null ? pageWrap.getModel().getStatus() : null; |
| | | return ApiResponse.success("æä½æå", memberCouponService.findMemberPage(getMemberId(), status, pageWrap)); |
| | | } |
| | | |
| | | @LoginRequired |
| | | @ApiOperation(value = "é¢å伿 å¸", notes = "å°ç¨åºç«¯") |
| | | @GetMapping("/claim") |
| | | @ApiImplicitParams({ |
| | | @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "ç¨æ·tokenå¼", required = true), |
| | | }) |
| | | public ApiResponse claim(@RequestParam Integer couponId) { |
| | | memberCouponService.claimCoupon(getMemberId(), couponId); |
| | | return ApiResponse.success("æä½æå"); |
| | | } |
| | | } |
| | |
| | | return ApiResponse.success("确认æ¶è´§æå"); |
| | | } |
| | | |
| | | |
| | | } |
| | |
| | | ordersRefundMapper.updateById(refundRecord); |
| | | log.info("鿬¾è®°å½ç¶æå·²æ´æ°, refundRecordId={}, status={}", refundRecord.getId(), refundRecord.getStatus()); |
| | | |
| | | // æå¨é款(type=4)鿬¾æå â æ§è¡æ£æ¬¾ |
| | | if (Status.SUCCESS.equals(refundStatus) && Constants.equalsInteger(refundRecord.getType(), Constants.FOUR)) { |
| | | try { |
| | | ordersService.processManualRefundCallback(refundRecord); |
| | | } catch (Exception ex) { |
| | | log.error("æå¨éæ¬¾æ£æ¬¾å¤çå¼å¸¸, refundRecordId={}", refundRecord.getId(), ex); |
| | | } |
| | | } |
| | | |
| | | // 鿬¾æå â éç¥ä¼å |
| | | if (Status.SUCCESS.equals(refundStatus) && refundRecord.getOrderId() != null) { |
| | | Orders refundOrder = ordersMapper.selectById(refundRecord.getOrderId()); |
| | |
| | | import com.doumee.core.model.PageWrap; |
| | | import com.doumee.dao.business.model.Revenue; |
| | | import com.doumee.dao.dto.RevenueQueryDTO; |
| | | import com.doumee.dao.dto.ShopRevenueQueryDTO; |
| | | import com.doumee.dao.vo.LuggageTypeItem; |
| | | import com.doumee.dao.vo.RevenueSummaryVO; |
| | | import com.doumee.dao.vo.ShopKpiVO; |
| | | import com.doumee.dao.vo.DriverKpiVO; |
| | | import com.doumee.dao.vo.DriverOrderTrendVO; |
| | | import com.doumee.dao.vo.DriverRewardHallVO; |
| | | import com.doumee.dao.dto.ClaimRewardDTO; |
| | | import com.doumee.service.business.RevenueService; |
| | | import com.doumee.service.business.ShopInfoService; |
| | | import io.swagger.annotations.Api; |
| | | import io.swagger.annotations.ApiImplicitParam; |
| | | import io.swagger.annotations.ApiImplicitParams; |
| | |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.validation.annotation.Validated; |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | | import javax.validation.Valid; |
| | | import java.util.List; |
| | | |
| | | @Api(tags = "äº¤ææµæ°´") |
| | | @Trace(exclude = true) |
| | |
| | | |
| | | @Autowired |
| | | private RevenueService revenueService; |
| | | |
| | | @Autowired |
| | | private ShopInfoService shopInfoService; |
| | | |
| | | @LoginDriverRequired |
| | | @ApiOperation(value = "叿ºæµæ°´å页", notes = "å°ç¨åºç«¯") |
| | |
| | | return ApiResponse.success("æ¥è¯¢æå", revenueService.getShopRevenueSummary(queryDTO, getShopId())); |
| | | } |
| | | |
| | | @LoginShopRequired |
| | | @ApiOperation("é¨åºè¡æç±»ååå¸") |
| | | @PostMapping("/shopLuggageType") |
| | | @ApiImplicitParams({ |
| | | @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "é¨åºtokenå¼", required = true), |
| | | }) |
| | | public ApiResponse<List<LuggageTypeItem>> shopLuggageType(@RequestBody @Valid ShopRevenueQueryDTO query) { |
| | | return ApiResponse.success("æ¥è¯¢æå", shopInfoService.shopLuggageTypeList(getShopId(), query)); |
| | | } |
| | | |
| | | @LoginShopRequired |
| | | @ApiOperation("é¨åºæ ¸å¿ä¸ç»©ææ ") |
| | | @PostMapping("/shopKpi") |
| | | @ApiImplicitParams({ |
| | | @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "é¨åºtokenå¼", required = true), |
| | | }) |
| | | public ApiResponse<ShopKpiVO> shopKpi(@RequestBody @Valid ShopRevenueQueryDTO query) { |
| | | return ApiResponse.success("æ¥è¯¢æå", shopInfoService.getShopKpi(getShopId(), query)); |
| | | } |
| | | |
| | | @LoginDriverRequired |
| | | @ApiOperation("叿ºæ ¸å¿ä¸ç»©ææ ") |
| | | @PostMapping("/driverKpi") |
| | | @ApiImplicitParams({ |
| | | @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "ç¨æ·tokenå¼", required = true), |
| | | }) |
| | | public ApiResponse<DriverKpiVO> driverKpi(@RequestBody @Valid ShopRevenueQueryDTO query) { |
| | | return ApiResponse.success("æ¥è¯¢æå", revenueService.getDriverKpi(getDriverId(), query)); |
| | | } |
| | | |
| | | @LoginDriverRequired |
| | | @ApiOperation("叿ºè¿ä¸æ¥è®¢åè¶å¿") |
| | | @PostMapping("/driverOrderTrend") |
| | | @ApiImplicitParams({ |
| | | @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "ç¨æ·tokenå¼", required = true), |
| | | }) |
| | | public ApiResponse<List<DriverOrderTrendVO>> driverOrderTrend() { |
| | | return ApiResponse.success("æ¥è¯¢æå", revenueService.getDriverOrderTrend(getDriverId())); |
| | | } |
| | | |
| | | @LoginDriverRequired |
| | | @ApiOperation("叿ºå¥å±å¤§å
") |
| | | @PostMapping("/driverRewardHall") |
| | | @ApiImplicitParams({ |
| | | @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "ç¨æ·tokenå¼", required = true), |
| | | }) |
| | | public ApiResponse<DriverRewardHallVO> driverRewardHall() { |
| | | return ApiResponse.success("æ¥è¯¢æå", revenueService.getDriverRewardHall(getDriverId())); |
| | | } |
| | | |
| | | @LoginDriverRequired |
| | | @ApiOperation("é¢åå¥å±é") |
| | | @PostMapping("/claimReward") |
| | | @ApiImplicitParams({ |
| | | @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "ç¨æ·tokenå¼", required = true), |
| | | }) |
| | | public ApiResponse<String> claimReward(@RequestBody @Valid ClaimRewardDTO dto) { |
| | | revenueService.claimReward(getDriverId(), dto.getRewardRecordId()); |
| | | return ApiResponse.success("é¢åæå"); |
| | | } |
| | | |
| | | } |
| | |
| | | import com.doumee.dao.dto.ShopNearbyDTO; |
| | | import com.doumee.dao.vo.ShopDetailVO; |
| | | import com.doumee.dao.vo.ShopCenterVO; |
| | | import com.doumee.dao.vo.LocationTagShopCountVO; |
| | | import com.doumee.dao.vo.ShopNearbyVO; |
| | | import com.doumee.dao.vo.ShopSalesStatsVO; |
| | | import com.doumee.dao.vo.ShopWebDetailVO; |
| | |
| | | import javax.validation.Valid; |
| | | import org.springframework.validation.annotation.Validated; |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * é¨åºå
¥é©»ï¼å°ç¨åºç«¯ï¼ |
| | |
| | | return ApiResponse.success(shopInfoService.findNearbyShops(pageWrap)); |
| | | } |
| | | |
| | | @ApiOperation("æä½ç½®æ ç¾ç»è®¡é¨åºæ°é") |
| | | @GetMapping("/locationTagShopCount") |
| | | public ApiResponse<List<LocationTagShopCountVO>> locationTagShopCount( |
| | | @RequestParam(required = false) Integer cityId) { |
| | | return ApiResponse.success(shopInfoService.countShopsByLocationTag(cityId)); |
| | | } |
| | | |
| | | @ApiOperation("é¨åºè¯¦æ
") |
| | | @PostMapping("/detail") |
| | | public ApiResponse<ShopWebDetailVO> detail(@RequestBody @Validated ShopDetailQueryDTO dto) { |