|
|
@@ -6,6 +6,7 @@ import com.fs.app.annotation.Login;
|
|
|
import com.fs.app.controller.AppBaseController;
|
|
|
import com.fs.common.annotation.Log;
|
|
|
import com.fs.common.annotation.RepeatSubmit;
|
|
|
+import com.fs.common.constant.HttpStatus;
|
|
|
import com.fs.common.core.domain.AjaxResult;
|
|
|
import com.fs.common.core.domain.R;
|
|
|
import com.fs.common.enums.BusinessType;
|
|
|
@@ -18,6 +19,7 @@ import com.fs.erp.service.impl.JSTErpOrderServiceImpl;
|
|
|
import com.fs.his.domain.FsPayConfig;
|
|
|
import com.fs.his.domain.MerchantAppConfig;
|
|
|
import com.fs.his.mapper.MerchantAppConfigMapper;
|
|
|
+import com.fs.hisStore.enums.OrderInfoEnum;
|
|
|
import com.fs.live.domain.LiveCart;
|
|
|
import com.fs.live.service.ILiveCartService;
|
|
|
import com.fs.live.vo.LiveCartVo;
|
|
|
@@ -59,8 +61,15 @@ import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.web.bind.annotation.*;
|
|
|
|
|
|
import java.math.BigDecimal;
|
|
|
+import java.nio.charset.StandardCharsets;
|
|
|
+import java.nio.file.Files;
|
|
|
+import java.nio.file.Path;
|
|
|
+import java.nio.file.Paths;
|
|
|
+import java.nio.file.StandardOpenOption;
|
|
|
import java.text.DecimalFormat;
|
|
|
import java.text.SimpleDateFormat;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.Date;
|
|
|
import java.util.HashMap;
|
|
|
import java.util.List;
|
|
|
import java.util.Map;
|
|
|
@@ -78,6 +87,8 @@ import com.fs.common.utils.StringUtils;
|
|
|
@Api(tags = "购物车管理")
|
|
|
public class LiveCartController extends AppBaseController
|
|
|
{
|
|
|
+ private static final String FINISH_ORDER_LOG_FILE = "积分文档.txt";
|
|
|
+
|
|
|
@Autowired
|
|
|
private ILiveCartService liveCartService;
|
|
|
|
|
|
@@ -266,6 +277,148 @@ public class LiveCartController extends AppBaseController
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 外部传入商城订单号(逗号分隔),查询订单并校验状态,正常则完成结算(待收货 -> 已完成)
|
|
|
+ */
|
|
|
+ @GetMapping("/finishOrder")
|
|
|
+ @ApiOperation("商城订单结算完成")
|
|
|
+ @ApiImplicitParam(name = "orderCodes", value = "订单号,逗号分隔", required = true, dataType = "String", paramType = "query")
|
|
|
+ public R finishOrderByCodes(@RequestParam("orderCodes") String orderCodes)
|
|
|
+ {
|
|
|
+ try {
|
|
|
+ log.info("商城订单结算完成请求,订单号: {}", orderCodes);
|
|
|
+
|
|
|
+ if (StringUtils.isEmpty(orderCodes)) {
|
|
|
+ return R.error("订单号不能为空");
|
|
|
+ }
|
|
|
+
|
|
|
+ String[] codeArr = orderCodes.split(",");
|
|
|
+ List<Map<String, String>> successList = new ArrayList<>();
|
|
|
+ List<Map<String, String>> failList = new ArrayList<>();
|
|
|
+
|
|
|
+ for (String rawCode : codeArr) {
|
|
|
+ String orderCode = rawCode.trim();
|
|
|
+ if (StringUtils.isEmpty(orderCode)) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ FsStoreOrderScrm order = fsStoreOrderScrmService.selectFsStoreOrderByOrderCode(orderCode);
|
|
|
+ if (order == null) {
|
|
|
+ failList.add(buildRecordItem(orderCode, "订单不存在"));
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (order.getIsDel() != null && order.getIsDel() == 1) {
|
|
|
+ failList.add(buildRecordItem(orderCode, "订单已删除"));
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (order.getPaid() == null || !OrderInfoEnum.PAY_STATUS_1.getValue().equals(order.getPaid())) {
|
|
|
+ failList.add(buildRecordItem(orderCode, "订单未支付"));
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (order.getStatus() != null && order.getStatus() < 0) {
|
|
|
+ failList.add(buildRecordItem(orderCode, "订单处于退款或取消状态,无法结算"));
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (OrderInfoEnum.STATUS_3.getValue().equals(order.getStatus())) {
|
|
|
+ successList.add(buildRecordItem(orderCode, "订单已完成"));
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!OrderInfoEnum.STATUS_2.getValue().equals(order.getStatus())) {
|
|
|
+ failList.add(buildRecordItem(orderCode, "订单状态异常,当前状态不允许结算(需为待收货)"));
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ R result = fsStoreOrderScrmService.finishOrder(order.getId());
|
|
|
+ if (result.get("code") != null && HttpStatus.SUCCESS == (Integer) result.get("code")) {
|
|
|
+ successList.add(buildRecordItem(orderCode, "结算完成"));
|
|
|
+ } else {
|
|
|
+ failList.add(buildRecordItem(orderCode, String.valueOf(result.get("msg"))));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (successList.isEmpty() && failList.isEmpty()) {
|
|
|
+ return R.error("未解析到有效订单号");
|
|
|
+ }
|
|
|
+
|
|
|
+ appendFinishOrderRecord(orderCodes, successList, failList);
|
|
|
+
|
|
|
+ return R.ok("处理完成")
|
|
|
+ .put("successList", successList)
|
|
|
+ .put("failList", failList)
|
|
|
+ .put("successCount", successList.size())
|
|
|
+ .put("failCount", failList.size());
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("商城订单结算完成异常,订单号: {}", orderCodes, e);
|
|
|
+ appendFinishOrderRecord(orderCodes, new ArrayList<>(),
|
|
|
+ java.util.Collections.singletonList(buildRecordItem(orderCodes, "系统异常: " + e.getMessage())));
|
|
|
+ return R.error("订单结算失败: " + e.getMessage());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private Map<String, String> buildRecordItem(String orderCode, String msg) {
|
|
|
+ Map<String, String> item = new HashMap<>(2);
|
|
|
+ item.put("orderCode", orderCode);
|
|
|
+ item.put("msg", msg);
|
|
|
+ return item;
|
|
|
+ }
|
|
|
+
|
|
|
+ private void appendFinishOrderRecord(String orderCodes, List<Map<String, String>> successList,
|
|
|
+ List<Map<String, String>> failList) {
|
|
|
+ try {
|
|
|
+ Path logPath = resolveIntegralDocPath();
|
|
|
+ Files.createDirectories(logPath.getParent());
|
|
|
+
|
|
|
+ String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
|
|
|
+ StringBuilder content = new StringBuilder();
|
|
|
+ content.append("========== ").append(time).append(" ==========\n");
|
|
|
+ content.append("接口: GET /live/liveCart/finishOrder\n");
|
|
|
+ content.append("请求订单号: ").append(orderCodes).append("\n");
|
|
|
+ content.append("成功(").append(successList.size()).append("):\n");
|
|
|
+ if (successList.isEmpty()) {
|
|
|
+ content.append(" 无\n");
|
|
|
+ } else {
|
|
|
+ for (Map<String, String> item : successList) {
|
|
|
+ content.append(" - ").append(item.get("orderCode"))
|
|
|
+ .append(" | ").append(item.get("msg")).append("\n");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ content.append("失败(").append(failList.size()).append("):\n");
|
|
|
+ if (failList.isEmpty()) {
|
|
|
+ content.append(" 无\n");
|
|
|
+ } else {
|
|
|
+ for (Map<String, String> item : failList) {
|
|
|
+ content.append(" - ").append(item.get("orderCode"))
|
|
|
+ .append(" | ").append(item.get("msg")).append("\n");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ content.append("\n");
|
|
|
+
|
|
|
+ Files.write(logPath, content.toString().getBytes(StandardCharsets.UTF_8),
|
|
|
+ StandardOpenOption.CREATE, StandardOpenOption.APPEND);
|
|
|
+ log.info("商城订单结算记录已写入: {}", logPath.toAbsolutePath());
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.warn("写入商城订单结算记录失败: {}", e.getMessage());
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
+ private Path resolveIntegralDocPath() {
|
|
|
+ Path dir = Paths.get(System.getProperty("user.dir")).toAbsolutePath().normalize();
|
|
|
+ for (int i = 0; i < 6; i++) {
|
|
|
+ Path candidate = dir.resolve("test").resolve(FINISH_ORDER_LOG_FILE);
|
|
|
+ if (Files.exists(dir.resolve("test"))) {
|
|
|
+ return candidate;
|
|
|
+ }
|
|
|
+ if (dir.getParent() == null) {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ dir = dir.getParent();
|
|
|
+ }
|
|
|
+ return Paths.get("c:/mycode/scrm/test", FINISH_ORDER_LOG_FILE);
|
|
|
+ }
|
|
|
|
|
|
}
|