发货包裹选择

This commit is contained in:
quantulr
2024-05-15 17:29:54 +08:00
parent d44d0d8d02
commit 21029bcf0d
14 changed files with 567 additions and 92 deletions

74
.idea/workspace.xml generated
View File

@ -5,22 +5,15 @@
</component> </component>
<component name="ChangeListManager"> <component name="ChangeListManager">
<list default="true" id="bdad98b9-7a5e-48f7-b79e-ed6a34d55dab" name="Default Changelist" comment="第一次提交"> <list default="true" id="bdad98b9-7a5e-48f7-b79e-ed6a34d55dab" name="Default Changelist" comment="第一次提交">
<change afterPath="$PROJECT_DIR$/src/main/webapp/static/core/js/assets/index-DVoHNO1Y.js" afterDir="false" /> <change afterPath="$PROJECT_DIR$/src/main/java/com/wisdo/mmining/controller/dto/ApprovalUpdateAddressDto.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/main/webapp/static/core/js/assets/index-DiwrgTda.css" afterDir="false" /> <change afterPath="$PROJECT_DIR$/src/main/java/com/wisdo/mmining/controller/dto/GoodsDeDto.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/main/webapp/static/core/js/assets/react-CHdo91hT.svg" afterDir="false" /> <change afterPath="$PROJECT_DIR$/src/main/java/com/wisdo/mmining/controller/dto/LogisticsDto.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/main/webapp/static/core/js/base/tailwindcss.js" afterDir="false" /> <change afterPath="$PROJECT_DIR$/src/main/java/com/wisdo/mmining/controller/dto/PackageDto.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/main/webapp/static/core/js/react/react-dom.production.min.js" afterDir="false" /> <change afterPath="$PROJECT_DIR$/src/main/webapp/static/core/js/base/babel.min.js" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/main/webapp/static/core/js/react/react.production.min.js" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/main/webapp/static/dist/order_logistics/index-BMTRAcdn.css" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/main/webapp/static/dist/order_logistics/index-ClekkQW0.js" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/main/webapp/static/dist/order_logistics/react-CHdo91hT.svg" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/vcs.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/vcs.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" /> <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/com/wisdo/mmining/api/OrderApi.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/wisdo/mmining/api/OrderApi.java" afterDir="false" /> <change beforePath="$PROJECT_DIR$/src/main/java/com/wisdo/mmining/api/dto/EditOrderAddressDto.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/wisdo/mmining/api/dto/EditOrderAddressDto.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/com/wisdo/mmining/controller/OrderController.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/wisdo/mmining/controller/OrderController.java" afterDir="false" /> <change beforePath="$PROJECT_DIR$/src/main/java/com/wisdo/mmining/controller/OrderController.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/wisdo/mmining/controller/OrderController.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/com/wisdo/mmining/entity/WisdOeder.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/wisdo/mmining/entity/WisdOeder.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/resources/application-db.yml" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/resources/application-db.yml" afterDir="false" /> <change beforePath="$PROJECT_DIR$/src/main/resources/application-db.yml" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/resources/application-db.yml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/resources/application.yml" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/resources/application.yml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/webapp/WEB-INF/view/pages/order/order_edit_address.jsp" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/webapp/WEB-INF/view/pages/order/order_edit_address.jsp" afterDir="false" /> <change beforePath="$PROJECT_DIR$/src/main/webapp/WEB-INF/view/pages/order/order_edit_address.jsp" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/webapp/WEB-INF/view/pages/order/order_edit_address.jsp" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/webapp/WEB-INF/view/pages/order/order_list.jsp" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/webapp/WEB-INF/view/pages/order/order_list.jsp" afterDir="false" /> <change beforePath="$PROJECT_DIR$/src/main/webapp/WEB-INF/view/pages/order/order_list.jsp" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/webapp/WEB-INF/view/pages/order/order_list.jsp" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/webapp/WEB-INF/view/pages/order/order_logistics.jsp" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/webapp/WEB-INF/view/pages/order/order_logistics.jsp" afterDir="false" /> <change beforePath="$PROJECT_DIR$/src/main/webapp/WEB-INF/view/pages/order/order_logistics.jsp" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/webapp/WEB-INF/view/pages/order/order_logistics.jsp" afterDir="false" />
@ -460,33 +453,33 @@
<option name="hideEmptyMiddlePackages" value="true" /> <option name="hideEmptyMiddlePackages" value="true" />
<option name="showLibraryContents" value="true" /> <option name="showLibraryContents" value="true" />
</component> </component>
<component name="PropertiesComponent"><![CDATA[{ <component name="PropertiesComponent">{
"keyToString": { &quot;keyToString&quot;: {
"Maven.wisdommining [clean].executor": "Run", &quot;Maven.wisdommining [clean].executor&quot;: &quot;Run&quot;,
"Maven.wisdommining [package].executor": "Run", &quot;Maven.wisdommining [package].executor&quot;: &quot;Run&quot;,
"RequestMappingsPanelOrder0": "0", &quot;RequestMappingsPanelOrder0&quot;: &quot;0&quot;,
"RequestMappingsPanelOrder1": "1", &quot;RequestMappingsPanelOrder1&quot;: &quot;1&quot;,
"RequestMappingsPanelWidth0": "75", &quot;RequestMappingsPanelWidth0&quot;: &quot;75&quot;,
"RequestMappingsPanelWidth1": "75", &quot;RequestMappingsPanelWidth1&quot;: &quot;75&quot;,
"RunOnceActivity.ShowReadmeOnStart": "true", &quot;RunOnceActivity.ShowReadmeOnStart&quot;: &quot;true&quot;,
"Spring Boot.WisdoMminingApplication.executor": "Debug", &quot;Spring Boot.WisdoMminingApplication.executor&quot;: &quot;Debug&quot;,
"dart.analysis.tool.window.visible": "false", &quot;dart.analysis.tool.window.visible&quot;: &quot;false&quot;,
"git-widget-placeholder": "master", &quot;git-widget-placeholder&quot;: &quot;master&quot;,
"kotlin-language-version-configured": "true", &quot;kotlin-language-version-configured&quot;: &quot;true&quot;,
"last_opened_file_path": "D:/Documents/IdeaProjects/wisdommining-serve/src/main/webapp/static/dist/order_logistics", &quot;last_opened_file_path&quot;: &quot;D:/Documents/IdeaProjects/wisdommining-serve/src/main/webapp/static/dist/order_logistics&quot;,
"node.js.detected.package.eslint": "true", &quot;node.js.detected.package.eslint&quot;: &quot;true&quot;,
"node.js.detected.package.tslint": "true", &quot;node.js.detected.package.tslint&quot;: &quot;true&quot;,
"node.js.selected.package.eslint": "(autodetect)", &quot;node.js.selected.package.eslint&quot;: &quot;(autodetect)&quot;,
"node.js.selected.package.tslint": "(autodetect)", &quot;node.js.selected.package.tslint&quot;: &quot;(autodetect)&quot;,
"nodejs_package_manager_path": "npm", &quot;nodejs_package_manager_path&quot;: &quot;npm&quot;,
"project.structure.last.edited": "全局库", &quot;project.structure.last.edited&quot;: &quot;全局库&quot;,
"project.structure.proportion": "0.0", &quot;project.structure.proportion&quot;: &quot;0.0&quot;,
"project.structure.side.proportion": "0.2", &quot;project.structure.side.proportion&quot;: &quot;0.2&quot;,
"settings.editor.selected.configurable": "project.propVCSSupport.DirectoryMappings", &quot;settings.editor.selected.configurable&quot;: &quot;project.propVCSSupport.DirectoryMappings&quot;,
"show.migrate.to.gradle.popup": "false", &quot;show.migrate.to.gradle.popup&quot;: &quot;false&quot;,
"vue.rearranger.settings.migration": "true" &quot;vue.rearranger.settings.migration&quot;: &quot;true&quot;
} }
}]]></component> }</component>
<component name="ReactorSettings"> <component name="ReactorSettings">
<option name="notificationShown" value="true" /> <option name="notificationShown" value="true" />
</component> </component>
@ -631,7 +624,8 @@
<workItem from="1715389027934" duration="14410000" /> <workItem from="1715389027934" duration="14410000" />
<workItem from="1715568844617" duration="447000" /> <workItem from="1715568844617" duration="447000" />
<workItem from="1715569361646" duration="7895000" /> <workItem from="1715569361646" duration="7895000" />
<workItem from="1715648805827" duration="24520000" /> <workItem from="1715648805827" duration="24869000" />
<workItem from="1715733500690" duration="26406000" />
</task> </task>
<task id="LOCAL-00001" summary="第一次提交"> <task id="LOCAL-00001" summary="第一次提交">
<created>1623736948713</created> <created>1623736948713</created>

View File

@ -1,11 +1,14 @@
package com.wisdo.mmining.api.dto; package com.wisdo.mmining.api.dto;
import com.wisdo.mmining.controller.dto.PackageDto;
import lombok.Data; import lombok.Data;
import java.util.List;
@Data @Data
public class EditOrderAddressDto { public class EditOrderAddressDto {
private int orderId; private int orderId;
private String orderAddress; private String orderAddress;
private String logisticsName; private String logisticsName;
private String logisticsNum; private List<PackageDto> logistics;
} }

View File

@ -9,6 +9,8 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import com.wisdo.mmining.api.dto.EditOrderAddressDto; import com.wisdo.mmining.api.dto.EditOrderAddressDto;
import com.wisdo.mmining.controller.dto.ApprovalUpdateAddressDto;
import com.wisdo.mmining.controller.dto.LogisticsDto;
import com.wisdo.mmining.entity.*; import com.wisdo.mmining.entity.*;
import com.wisdo.mmining.redis.RedisService; import com.wisdo.mmining.redis.RedisService;
import com.wisdo.mmining.result.Result; import com.wisdo.mmining.result.Result;
@ -206,6 +208,7 @@ public class OrderController {
modelAndView.addObject("orderId", orderId); modelAndView.addObject("orderId", orderId);
modelAndView.addObject("type", type); modelAndView.addObject("type", type);
modelAndView.addObject("order", order); modelAndView.addObject("order", order);
modelAndView.addObject("logistics", order.getLogistics());
return modelAndView; return modelAndView;
} }
@ -216,11 +219,17 @@ public class OrderController {
return new ModelAndView("sys/error"); return new ModelAndView("sys/error");
} }
WisdOeder order = orderService.getById(orderId); WisdOeder order = orderService.getById(orderId);
// ObjectMapper objectMapper = new ObjectMapper();
// String packagesJson = order.getLogistics();
// List<PackageDto> packages = objectMapper.readValue(packagesJson, new TypeReference<List<PackageDto>>() {
// });
//type 1 一级弹出层 2二级弹出层 //type 1 一级弹出层 2二级弹出层
ModelAndView modelAndView = new ModelAndView("pages/order/order_edit_address"); ModelAndView modelAndView = new ModelAndView("pages/order/order_edit_address");
modelAndView.addObject("orderId", orderId); modelAndView.addObject("orderId", orderId);
modelAndView.addObject("type", type); modelAndView.addObject("type", type);
modelAndView.addObject("order", order); modelAndView.addObject("order", order);
modelAndView.addObject("logistics", order.getLogistics());
return modelAndView; return modelAndView;
} }
@ -548,21 +557,24 @@ public class OrderController {
} }
@RequestMapping(value = "deliverGoods") @PostMapping(value = "deliverGoods")
@ResponseBody @ResponseBody
public Result deliverGoods(Long orderId, String logisticsName, String logisticsNum) { public Result deliverGoods(@RequestBody LogisticsDto logisticsDto) throws JsonProcessingException {
if (orderId == null || com.alibaba.druid.util.StringUtils.isEmpty(logisticsName) || StringUtils.isEmpty(logisticsNum)) { if (logisticsDto.getOrderId() == null || com.alibaba.druid.util.StringUtils.isEmpty(logisticsDto.getLogisticsName()) || logisticsDto.getPackages().isEmpty()) {
return new Result(ResultUtil.ERROR, "参数为空"); return new Result(ResultUtil.ERROR, "参数为空");
} }
WisdOeder order = orderService.getById(orderId); WisdOeder order = orderService.getById(logisticsDto.getOrderId());
if (order == null) { if (order == null) {
return new Result(ResultUtil.ERROR, ResultUtil.ERROR_MSG); return new Result(ResultUtil.ERROR, ResultUtil.ERROR_MSG);
} }
if (!order.getStatus().equals(2)) { if (!order.getStatus().equals(2)) {
return new Result(ResultUtil.ERROR, "该状态无法发货"); return new Result(ResultUtil.ERROR, "该状态无法发货");
} }
order.setLogisticsName(logisticsName); ObjectMapper mapper = new ObjectMapper();
order.setLogisticsNum(logisticsNum); String deliverGoodsJson = mapper.writeValueAsString(logisticsDto.getPackages());
order.setLogistics(deliverGoodsJson);
order.setLogisticsName(logisticsDto.getLogisticsName());
// order.setLogisticsNum(logisticsNum);
order.setStatus(3); order.setStatus(3);
order.setOrderDeliverTime(new Date()); order.setOrderDeliverTime(new Date());
Boolean flag = orderService.updateById(order); Boolean flag = orderService.updateById(order);
@ -576,19 +588,21 @@ public class OrderController {
// 处理修改地址申请 // 处理修改地址申请
@RequestMapping(value = "approvalUpdateAddress") @PostMapping(value = "approvalUpdateAddress")
@ResponseBody @ResponseBody
public Result approvalUpdateAddress(Long orderId, Integer type, String logisticsNo /*1 同意, 0 拒绝*/) { public Result approvalUpdateAddress(@RequestBody ApprovalUpdateAddressDto addressDto) throws JsonProcessingException {
WisdOeder order = orderService.getById(orderId); WisdOeder order = orderService.getById(addressDto.getOrderId());
if (type.equals(1)) { if (addressDto.getType().equals(1)) {
order.setOrderAddress(order.getPendingApprovalOrderAddress()); order.setOrderAddress(order.getPendingApprovalOrderAddress());
order.setAddressId(order.getPendingApprovalAddressId()); order.setAddressId(order.getPendingApprovalAddressId());
order.setLogisticsNum(logisticsNo); ObjectMapper mapper = new ObjectMapper();
String deliverGoodsJson = mapper.writeValueAsString(addressDto.getLogistics());
order.setLogistics(deliverGoodsJson);
order.setPendingApprovalAddressId(null); order.setPendingApprovalAddressId(null);
order.setPendingApprovalOrderAddress(null); order.setPendingApprovalOrderAddress(null);
orderService.updateById(order); orderService.updateById(order);
return ResultUtil.success("收货地址已更新"); return ResultUtil.success("收货地址已更新");
} else if (type.equals(0)) { } else if (addressDto.getType().equals(0)) {
order.setPendingApprovalAddressId(null); order.setPendingApprovalAddressId(null);
order.setPendingApprovalOrderAddress(null); order.setPendingApprovalOrderAddress(null);
return ResultUtil.success("已拒绝修改地址"); return ResultUtil.success("已拒绝修改地址");
@ -599,10 +613,12 @@ public class OrderController {
@PostMapping(value = "editAddress") @PostMapping(value = "editAddress")
@ResponseBody @ResponseBody
public Result editAddress(@RequestBody EditOrderAddressDto address) { public Result editAddress(@RequestBody EditOrderAddressDto address) throws JsonProcessingException {
WisdOeder order = orderService.getById(address.getOrderId()); WisdOeder order = orderService.getById(address.getOrderId());
ObjectMapper mapper = new ObjectMapper();
String deliverGoodsJson = mapper.writeValueAsString(address.getLogistics());
order.setLogistics(deliverGoodsJson);
order.setOrderAddress(address.getOrderAddress()); order.setOrderAddress(address.getOrderAddress());
order.setLogisticsNum(address.getLogisticsNum());
order.setLogisticsName(address.getLogisticsName()); order.setLogisticsName(address.getLogisticsName());
orderService.updateById(order); orderService.updateById(order);
return ResultUtil.success("地址修改成功"); return ResultUtil.success("地址修改成功");

View File

@ -0,0 +1,12 @@
package com.wisdo.mmining.controller.dto;
import lombok.Data;
import java.util.List;
@Data
public class ApprovalUpdateAddressDto {
private Long orderId;
private Integer type;
private List<PackageDto> logistics;
}

View File

@ -0,0 +1,10 @@
package com.wisdo.mmining.controller.dto;
import lombok.Data;
@Data
public class GoodsDeDto {
private Long id;
private String name;
private Integer num;
}

View File

@ -0,0 +1,12 @@
package com.wisdo.mmining.controller.dto;
import lombok.Data;
import java.util.List;
@Data
public class LogisticsDto {
private Long orderId;
private String logisticsName;
private List<PackageDto> packages;
}

View File

@ -0,0 +1,12 @@
package com.wisdo.mmining.controller.dto;
import lombok.Data;
import java.util.List;
@Data
public class PackageDto {
private Long id;
private List<GoodsDeDto> goods;
private String logisticsNumber;
}

View File

@ -1,7 +1,7 @@
#开发环境 #开发环境
spring: spring:
datasource: datasource:
url: jdbc:mysql://ayaya-arch.local:3306/wisdo?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8 url: jdbc:mysql://192.168.0.142:3306/wisdo?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8
# url: jdbc:mysql://146.56.198.32:3306/wisdo?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8 # url: jdbc:mysql://146.56.198.32:3306/wisdo?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8
username: yshop username: yshop
# username: root # username: root

View File

@ -15,10 +15,144 @@
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" <meta name="viewport"
content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0"> content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
<link rel="stylesheet" href="${root}/static/core/css/form.css" media="all"> <%-- <link rel="stylesheet" href="${root}/static/core/css/form.css" media="all">--%>
<script src="${root}/static/core/js/base/tailwindcss.js"></script>
<script>
let layer = null
layui.use(['layer'], function () {
layer = layui.layer
});
</script>
</head> </head>
<body style="background-color: white"> <body style="background-color: white">
<div class="layui-fluid"> <div id="root"></div>
<script type="text/babel">
const __logistics = ${logistics};
const orderId = ${orderId};
const orderAddress = "${order.orderAddress}";
const __logisticsName = "${order.logisticsName}";
const type = ${type};
const {useState} = React
const App = () => {
const [logisticsName, setLogisticsName] = useState(__logisticsName)
const [logistics, setLogistics] = useState(__logistics)
return <div className="p-4">
<form>
<div className="layui-form-item">
<label htmlFor="orderAddress" className="layui-form-label w-24">收货地址</label>
<div className="layui-input-block">
<input type="text" id="orderAddress" name="orderAddress" readOnly value={orderAddress}
placeholder="请输入收货地址" autoComplete="off" className="layui-input"/>
</div>
</div>
<div className="layui-form-item">
<label htmlFor="logisticsName" className="layui-form-label w-24">物流公司</label>
<div className="layui-input-block">
<input type="text" id="logisticsName" name="logisticsName" value={logisticsName}
onInput={ev => {
setLogisticsName(ev.target.value)
}}
placeholder="请输入物流公司" autoComplete="off" className="layui-input"/>
</div>
</div>
{logistics && logistics.map((pack, index) => <div
key={pack.id}
className={"mt-4 pt-4 pr-2 border rounded relative"}>
<div className="absolute left-4 -top-3 bg-white">包裹{index + 1}</div>
<div className="layui-form-item">
<label htmlFor={"logisticsNum" + index} className="layui-form-label w-24">物流单号</label>
<div className="layui-input-block">
<input type="text" id={"logisticsNum" + index} name="logisticsNum"
value={pack.logisticsNumber}
onInput={(ev) => {
const _logistics = [...logistics]
_logistics[index].logisticsNumber = ev.target.value
setLogistics(_logistics)
}}
placeholder="请输入物流单号" autoComplete="off" className="layui-input"/>
</div>
</div>
<div className="pl-2">
<table className="layui-table">
<thead>
<tr>
<th>名称</th>
<th>数量</th>
</tr>
</thead>
<tbody>
{
pack.goods.map((goods, idx) => <tr key={goods.id}>
<td>{goods.name}</td>
<td>{goods.num}</td>
</tr>
)
}
</tbody>
</table>
</div>
</div>)}
<div className="flex justify-center mt-4">
<button type="button" className="layui-btn layui-btn-primary" onClick={() => {
const formData = {
orderId,
orderAddress,
logisticsName,
logistics
}
$modal({
type: 'confirm',
icon: 'question',
title: '提交确定',
content: '确认提交吗?',
mask: true,
top: 50,
maskClose: true,
confirm: function (close) {
var index = layer.load(2);
let url = root + "/order/editAddress"
$.ajax({
method: "POST",
url,
data: JSON.stringify(formData),
contentType: "application/json; charset=utf-8",
success(e) {
layer.close(index);
if (e.code == 1) {
$.message({message: e.msg, type: "success"});
setTimeout(function () {
admin.close();
if (type == 1) {
admin.fatherReload();
} else {
admin.fatherReload();
admin.fatherFatherReload();
}
}, 500)
} else {
$.message({message: e.msg, type: "error"});
}
}
})
close()
},
cancel: function (close) {
close()
}
})
}}>提交
</button>
</div>
</form>
</div>
}
const container = document.getElementById("root")
const rootApp = ReactDOM.createRoot(container);
rootApp.render(<App/>);
</script>
<%--<div class="layui-fluid">
<div class="layui-row"> <div class="layui-row">
<form class="layui-form" id="formData" lay-filter="formData"> <form class="layui-form" id="formData" lay-filter="formData">
<input type="hidden" id="type" value="${type}"> <input type="hidden" id="type" value="${type}">
@ -37,13 +171,19 @@
placeholder="请输入物流公司" autocomplete="off" class="layui-input"> placeholder="请输入物流公司" autocomplete="off" class="layui-input">
</div> </div>
</div> </div>
<div class="layui-form-item formItem">
<label for="logisticsNum" class="layui-form-label">物流单号</label> <c:forEach items="${packages}" var="item">
<div class="layui-input-block"> <div>
<input type="text" id="logisticsNum" name="logisticsNum" value="${order.logisticsNum}" <div class="layui-form-item formItem">
placeholder="请输入物流单号" autocomplete="off" class="layui-input"> <label for="logisticsNum" class="layui-form-label">物流单号</label>
<div class="layui-input-block">
<input type="text" id="logisticsNum" name="logisticsNum" value="${item.logisticsNumber}"
placeholder="请输入物流单号" autocomplete="off" class="layui-input">
</div>
</div>
</div> </div>
</div> </c:forEach>
<div class="layui-form-item formItem"> <div class="layui-form-item formItem">
<label for="logisticsNum" class="layui-form-label"></label> <label for="logisticsNum" class="layui-form-label"></label>
<button class="layui-btn layui-btn-primary layui-btn-sm subBtn" style="width: 165px;margin-top: 23px;" <button class="layui-btn layui-btn-primary layui-btn-sm subBtn" style="width: 165px;margin-top: 23px;"
@ -105,6 +245,6 @@
return false; return false;
}); });
}) })
</script> </script>--%>
</body> </body>
</html> </html>

View File

@ -541,7 +541,7 @@
layer.open({ layer.open({
title: "处理发货地址修改申请", title: "处理发货地址修改申请",
content: root + "/order/getUpdateAddress?type=1&orderId=" + data.id, content: root + "/order/getUpdateAddress?type=1&orderId=" + data.id,
area: ['500px', '300px'], area: ['700px', '600px'],
offset: '20%', offset: '20%',
type: 2, type: 2,
}) })
@ -549,7 +549,7 @@
layer.open({ layer.open({
title: "修改地址", title: "修改地址",
content: root + "/order/getEditAddress?type=1&orderId=" + data.id, content: root + "/order/getEditAddress?type=1&orderId=" + data.id,
area: ['500px', '300px'], area: ['700px', '600px'],
offset: '20%', offset: '20%',
type: 2, type: 2,
}) })

View File

@ -10,24 +10,39 @@
<%-- <script type="module" crossorigin src="/wisdommining/static/dist/order_logistics/index-ClekkQW0.js"></script>--%> <%-- <script type="module" crossorigin src="/wisdommining/static/dist/order_logistics/index-ClekkQW0.js"></script>--%>
<%-- <link rel="stylesheet" crossorigin href="/wisdommining/static/dist/order_logistics/index-BMTRAcdn.css">--%> <%-- <link rel="stylesheet" crossorigin href="/wisdommining/static/dist/order_logistics/index-BMTRAcdn.css">--%>
<script crossorigin src="https://unpkg.com/react@18/umd/react.development.js"></script> <%-- <script crossorigin src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script>--%>
<%-- <script src="${root}/static/core/js/react/react.production.min.js"></script>--%> <%-- <script crossorigin src="https://unpkg.com/react@18/umd/react.development.js"></script>--%>
<script crossorigin src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script>
<script crossorigin src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
<script src="${root}/static/core/js/base/tailwindcss.js"></script> <script src="${root}/static/core/js/base/tailwindcss.js"></script>
<script> <script>
const orderId = ${orderId}; const orderId = ${orderId};
const order = ${order}; const order = ${order};
const type = ${type};
</script>
<script>
let layer = null
layui.use(['layer'], function () {
const _layer = layui.layer;
layer = _layer
});
// const getLayer = () => new Promise((resolve, reject) => {
// layui.use(function () {
// const layer = layui.layer;
// resolve(layer)
// });
// })
</script> </script>
</head> </head>
<body> <body style="background-color: white">
<div id="root"></div> <div id="root"></div>
<script type="text/babel"> <script type="text/babel">
const {useState} = React const {useState} = React
const App = () => { const App = () => {
const [packages, setPackages] = useState([{id: 0, goods: []}]) const [packages, setPackages] = useState([{id: Date.now(), logisticsNumber: "", goods: []}])
const [goodsList, setGoodsList] = useState(order?.goodsList ?? []) const [goodsList, setGoodsList] = useState(order?.goodsList ?? [])
const [logisticsName, setLogisticsName] = useState("")
const [activePackage, setActivePackage] = useState(0) const [activePackage, setActivePackage] = useState(0)
return <div> return <div>
<div className="p-2 flex"> <div className="p-2 flex">
@ -50,14 +65,21 @@
<button className="layui-btn layui-btn-xs" onClick={() => { <button className="layui-btn layui-btn-xs" onClick={() => {
// TODO: STEP1: 将商品添加到 packages 中 // TODO: STEP1: 将商品添加到 packages 中
const _packages = [...packages] const _packages = [...packages]
_packages[activePackage].goods.push({ const goodsInPackageIndex = _packages[activePackage].goods.findIndex(el => el.id === goods.id)
name: goods.goodsName, if (goodsInPackageIndex !== -1) {
num: goods.goodsNum _packages[activePackage].goods[goodsInPackageIndex].num += 1
}) } else {
_packages[activePackage].goods.push({
id: goods.id,
name: goods.goodsName,
num: 1
})
}
setPackages(_packages) setPackages(_packages)
// TODO: STEP2: 在 goodsList 中扣除已添加的商品数量 goodsNum
const _goodsList = [...goodsList] const _goodsList = [...goodsList]
_goodsList.find(el => el.id === goods.id).goodsNum -= 1
setGoodsList(_goodsList)
}}> }}>
添加到包裹 添加到包裹
</button> </button>
@ -74,7 +96,9 @@
<div className="layui-form-item"> <div className="layui-form-item">
<label className="layui-form-label w-[100px]">物流名称</label> <label className="layui-form-label w-[100px]">物流名称</label>
<div className="layui-input-block"> <div className="layui-input-block">
<input type="text" name="username" lay-verify="required" <input type="text" name="logisticsName" value={logisticsName} onInput={(event) => {
setLogisticsName(() => event.target.value)
}}
placeholder="请输入物流公司名称" placeholder="请输入物流公司名称"
autoComplete="off" className="layui-input"/> autoComplete="off" className="layui-input"/>
</div> </div>
@ -82,7 +106,7 @@
{ {
packages.map((pack, index) => <div key={pack.id} packages.map((pack, index) => <div key={pack.id}
style={{ style={{
borderColor: activePackage === index ? "rgb(252 165 165)" : "rgb(209 213 219)", borderColor: activePackage === index ? "rgb(96 165 250)" : "rgb(209 213 219)",
// boxShadow: activePackage === index ? "0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);" : null, // boxShadow: activePackage === index ? "0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);" : null,
}} }}
onClick={() => { onClick={() => {
@ -92,25 +116,75 @@
<div className="absolute left-4 -top-3 bg-white">包裹{index + 1}</div> <div className="absolute left-4 -top-3 bg-white">包裹{index + 1}</div>
{packages.length > 1 && < button type="button" {packages.length > 1 && < button type="button"
onClick={() => { onClick={() => {
if (index === activePackage) {
// TODO: WHY
setTimeout(() => {
setActivePackage(state => state - 1)
}, 0)
}
setPackages(state => state.filter(el => pack.id !== el.id)) setPackages(state => state.filter(el => pack.id !== el.id))
// TODO: 删除该包裹中所有商品
const _goodsList = [...goodsList]
for (const p of pack.goods) {
_goodsList.find(g => g.id === p.id).goodsNum += p.num
}
setGoodsList(_goodsList)
}} }}
className="w-4 h-4 rounded-full bg-red-500 absolute -top-2 -right-2 flex justify-center items-center"> className="w-4 h-4 rounded-full bg-red-500 absolute -top-2 -right-2 flex justify-center items-center">
<i className="layui-icon layui-icon-close text-white"></i> <i className="layui-icon layui-icon-close text-white"></i>
</button>} </button>}
<div className="layui-form-item"> <div className="layui-form-item">
<label className="layui-form-label w-[100px]">运单号</label> <label className="layui-form-label w-[100px]"
htmlFor={"logisticsNumber" + index}>运单号</label>
<div className="layui-input-block"> <div className="layui-input-block">
<input type="text" name="logisticsNumber" lay-verify="required" <input type="text" name="logisticsNumber" id={"logisticsNumber" + index}
value={pack.logisticsNumber}
onInput={(event) => {
const _packages = [...packages]
_packages[index].logisticsNumber = event.target.value
setPackages(_packages)
}}
placeholder="请输入运单号" placeholder="请输入运单号"
autoComplete="off" className="layui-input"/> autoComplete="off" className="layui-input"/>
</div> </div>
</div> </div>
<div> <div className="pl-2">
{ <table className="layui-table">
pack.goods.map(goods => <div key={goods.goodsName}> <thead>
{goods.name} <tr>
</div>) <th>名称</th>
} <th>数量</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{
pack.goods.map((goods, idx) => <tr key={goods.id}>
<td>{goods.name}</td>
<td>{goods.num}</td>
<td>
<button className="layui-btn layui-btn-xs" type="button"
onClick={() => {
// 数量 -1减至 0 时,从包裹中删除该项商品
const _packages = [...packages]
_packages[index].goods[idx].num -= 1
setPackages(_packages.map(p => ({
...p,
goods: p.goods.filter(g => g.num > 0)
})))
// TODO: goodsList 中数量 +1
const _goodsList = [...goodsList]
_goodsList.find(el => el.id === _packages[index].goods[idx].id).goodsNum += 1
setGoodsList(_goodsList)
}}>移除
</button>
</td>
</tr>
)
}
</tbody>
</table>
</div> </div>
</div>) </div>)
} }
@ -118,9 +192,11 @@
setPackages(state => { setPackages(state => {
return [...state, { return [...state, {
id: Date.now(), id: Date.now(),
logisticsNumber: "",
goods: [] goods: []
}] }]
}) })
setActivePackage(packages.length)
}}>添加包裹 }}>添加包裹
</button> </button>
</form> </form>
@ -128,13 +204,86 @@
</div> </div>
</div> </div>
<div className="flex justify-center"> <div className="flex justify-center">
<button className="layui-btn layui-btn-primary">提交</button> <button className="layui-btn layui-btn-primary" onClick={() => {
// 验证
if (goodsList.filter(el => el.goodsNum > 0).length) {
layer.msg('有未添加到包裹中的商品', {icon: 2});
return
}
if (packages.filter(el => el.goods.length === 0).length) {
layer.msg('有空包裹,请向其添加商品,或删除包裹', {icon: 2});
return
}
if (packages.filter(el => el.goods.length === 0).length) {
layer.msg('有空包裹,请向其添加商品,或删除包裹', {icon: 2});
return
}
if (!logisticsName) {
layer.msg('未填写物流名称', {icon: 2});
return
}
for (let x = 0; x < packages.length; x++) {
if (!packages[x].logisticsNumber) {
layer.msg("包裹" + (x + 1) + '未填写物流单号', {icon: 2});
return
}
}
const formData = {
orderId,
logisticsName,
packages
}
$modal({
type: 'confirm',
icon: 'question',
title: '提交确定',
content: '确认提交吗?',
mask: true,
top: 50,
maskClose: true,
confirm: function (close) {
var index = layer.load(2);
$.ajax({
method: "POST",
url: root + "/order/deliverGoods",
data: JSON.stringify(formData),
contentType: "application/json; charset=utf-8",
success(e) {
layer.close(index);
if (e.code == 1) {
$.message({message: e.msg, type: "success"});
setTimeout(function () {
admin.close();
if (type == 1) {
admin.fatherReload();
} else {
admin.fatherReload();
admin.fatherFatherReload();
}
}, 500)
} else {
$.message({message: e.msg, type: "error"});
}
}
})
// $.post(root + "/order/deliverGoods", formData, function (e) {
//
// }, "json")
close()
},
cancel: function (close) {
close()
}
})
}}>提交
</button>
</div> </div>
</div> </div>
} }
const container = document.getElementById("root") const container = document.getElementById("root")
const root = ReactDOM.createRoot(container); const rootApp = ReactDOM.createRoot(container);
root.render(<App/>); rootApp.render(<App/>);
</script> </script>
</body> </body>
</html> </html>

View File

@ -15,9 +15,129 @@
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" <meta name="viewport"
content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0"> content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
<link rel="stylesheet" href="${root}/static/core/css/form.css" media="all"> <%-- <link rel="stylesheet" href="${root}/static/core/css/form.css" media="all">--%>
<script src="${root}/static/core/js/base/tailwindcss.js"></script>
<script>
let layer = null
layui.use(['layer'], function () {
layer = layui.layer
});
</script>
</head> </head>
<body style="background-color: white"> <body style="background-color: white">
<div id="root"></div>
<script type="text/babel">
const __logistics = ${logistics};
const type = ${type};
const orderId = ${orderId};
const orderAddress = ${order.pendingApprovalOrderAddress};
const {useState} = React
const App = () => {
const [logistics, setLogistics] = useState(__logistics)
return <div className="p-4">
<form>
<div className="layui-form-item">
<label htmlFor="logisticsName" className="layui-form-label w-24">发货地址</label>
<div className="layui-input-block">
<input type="text" readOnly id="logisticsName" name="logisticsName" lay-verify="required"
value="${order.pendingApprovalOrderAddress}"
autoComplete="off" className="layui-input"/>
</div>
</div>
{logistics && logistics.map((pack, index) => <div key={pack.id}
className={"mt-4 pt-4 pr-2 border rounded relative"}>
<div className="absolute left-4 -top-3 bg-white">包裹{index + 1}</div>
<div className="layui-form-item">
<label htmlFor={"logisticsNum" + index} className="layui-form-label w-24">物流单号</label>
<div className="layui-input-block">
<input type="text" id={"logisticsNum" + index} name="logisticsNum"
value={pack.logisticsNumber}
onInput={(ev) => {
const _logistics = [...logistics]
_logistics[index].logisticsNumber = ev.target.value
setLogistics(_logistics)
}}
placeholder="请输入物流单号" autoComplete="off" className="layui-input"/>
</div>
</div>
<div className="pl-2">
<table className="layui-table">
<thead>
<tr>
<th>名称</th>
<th>数量</th>
</tr>
</thead>
<tbody>
{
pack.goods.map((goods) => <tr key={goods.id}>
<td>{goods.name}</td>
<td>{goods.num}</td>
</tr>
)
}
</tbody>
</table>
</div>
</div>)}
<div className="flex justify-center">
<button type="button" onClick={() => {
const formData = {
orderId,
type: 1,
logistics
}
$modal({
type: 'confirm',
icon: 'question',
title: '提交确定',
content: '确认提交吗?',
mask: true,
top: 50,
maskClose: true,
confirm: function (close) {
var index = layer.load(2);
let url = root + "/order/approvalUpdateAddress"
$.ajax({
url,
method: "POST",
contentType: "application/json; charset=utf-8",
data: JSON.stringify(formData),
success(e) {
layer.close(index);
if (e.code == 1) {
$.message({message: e.msg, type: "success"});
setTimeout(function () {
admin.close();
if (type == 1) {
admin.fatherReload();
} else {
admin.fatherReload();
admin.fatherFatherReload();
}
}, 500)
} else {
$.message({message: e.msg, type: "error"});
}
}
})
close()
},
cancel: function (close) {
close()
}
})
}}>提交
</button>
</div>
</form>
</div>
}
const container = document.getElementById("root")
const rootApp = ReactDOM.createRoot(container);
rootApp.render(<App/>);
</script>
<%--
<div class="layui-fluid"> <div class="layui-fluid">
<div class="layui-row"> <div class="layui-row">
<form class="layui-form" id="formData" lay-filter="formData"> <form class="layui-form" id="formData" lay-filter="formData">
@ -93,5 +213,6 @@
}); });
}) })
</script> </script>
--%>
</body> </body>
</html> </html>

View File

@ -20,6 +20,10 @@
<script src="${root}/static/core/js/layui/xm-select.js"></script> <script src="${root}/static/core/js/layui/xm-select.js"></script>
<script src="${root}/static/core/js/base/message.min.js"></script> <script src="${root}/static/core/js/base/message.min.js"></script>
<script src="${root}/static/core/js/base/modal_dialog.js"></script> <script src="${root}/static/core/js/base/modal_dialog.js"></script>
<script src="${root}/static/core/js/react/react.production.min.js"></script>
<script src="${root}/static/core/js/react/react-dom.production.min.js"></script>
<script crossorigin src="${root}/static/core/js/base/babel.min.js"></script>
<script> <script>
var root = "${root}"; var root = "${root}";
var admin = function () { var admin = function () {

File diff suppressed because one or more lines are too long