发货包裹选择
This commit is contained in:
74
.idea/workspace.xml
generated
74
.idea/workspace.xml
generated
@ -5,22 +5,15 @@
|
||||
</component>
|
||||
<component name="ChangeListManager">
|
||||
<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/webapp/static/core/js/assets/index-DiwrgTda.css" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/src/main/webapp/static/core/js/assets/react-CHdo91hT.svg" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/src/main/webapp/static/core/js/base/tailwindcss.js" 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/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 afterPath="$PROJECT_DIR$/src/main/java/com/wisdo/mmining/controller/dto/ApprovalUpdateAddressDto.java" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/src/main/java/com/wisdo/mmining/controller/dto/GoodsDeDto.java" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/src/main/java/com/wisdo/mmining/controller/dto/LogisticsDto.java" 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/base/babel.min.js" 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/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.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_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" />
|
||||
@ -460,33 +453,33 @@
|
||||
<option name="hideEmptyMiddlePackages" value="true" />
|
||||
<option name="showLibraryContents" value="true" />
|
||||
</component>
|
||||
<component name="PropertiesComponent"><![CDATA[{
|
||||
"keyToString": {
|
||||
"Maven.wisdommining [clean].executor": "Run",
|
||||
"Maven.wisdommining [package].executor": "Run",
|
||||
"RequestMappingsPanelOrder0": "0",
|
||||
"RequestMappingsPanelOrder1": "1",
|
||||
"RequestMappingsPanelWidth0": "75",
|
||||
"RequestMappingsPanelWidth1": "75",
|
||||
"RunOnceActivity.ShowReadmeOnStart": "true",
|
||||
"Spring Boot.WisdoMminingApplication.executor": "Debug",
|
||||
"dart.analysis.tool.window.visible": "false",
|
||||
"git-widget-placeholder": "master",
|
||||
"kotlin-language-version-configured": "true",
|
||||
"last_opened_file_path": "D:/Documents/IdeaProjects/wisdommining-serve/src/main/webapp/static/dist/order_logistics",
|
||||
"node.js.detected.package.eslint": "true",
|
||||
"node.js.detected.package.tslint": "true",
|
||||
"node.js.selected.package.eslint": "(autodetect)",
|
||||
"node.js.selected.package.tslint": "(autodetect)",
|
||||
"nodejs_package_manager_path": "npm",
|
||||
"project.structure.last.edited": "全局库",
|
||||
"project.structure.proportion": "0.0",
|
||||
"project.structure.side.proportion": "0.2",
|
||||
"settings.editor.selected.configurable": "project.propVCSSupport.DirectoryMappings",
|
||||
"show.migrate.to.gradle.popup": "false",
|
||||
"vue.rearranger.settings.migration": "true"
|
||||
<component name="PropertiesComponent">{
|
||||
"keyToString": {
|
||||
"Maven.wisdommining [clean].executor": "Run",
|
||||
"Maven.wisdommining [package].executor": "Run",
|
||||
"RequestMappingsPanelOrder0": "0",
|
||||
"RequestMappingsPanelOrder1": "1",
|
||||
"RequestMappingsPanelWidth0": "75",
|
||||
"RequestMappingsPanelWidth1": "75",
|
||||
"RunOnceActivity.ShowReadmeOnStart": "true",
|
||||
"Spring Boot.WisdoMminingApplication.executor": "Debug",
|
||||
"dart.analysis.tool.window.visible": "false",
|
||||
"git-widget-placeholder": "master",
|
||||
"kotlin-language-version-configured": "true",
|
||||
"last_opened_file_path": "D:/Documents/IdeaProjects/wisdommining-serve/src/main/webapp/static/dist/order_logistics",
|
||||
"node.js.detected.package.eslint": "true",
|
||||
"node.js.detected.package.tslint": "true",
|
||||
"node.js.selected.package.eslint": "(autodetect)",
|
||||
"node.js.selected.package.tslint": "(autodetect)",
|
||||
"nodejs_package_manager_path": "npm",
|
||||
"project.structure.last.edited": "全局库",
|
||||
"project.structure.proportion": "0.0",
|
||||
"project.structure.side.proportion": "0.2",
|
||||
"settings.editor.selected.configurable": "project.propVCSSupport.DirectoryMappings",
|
||||
"show.migrate.to.gradle.popup": "false",
|
||||
"vue.rearranger.settings.migration": "true"
|
||||
}
|
||||
}]]></component>
|
||||
}</component>
|
||||
<component name="ReactorSettings">
|
||||
<option name="notificationShown" value="true" />
|
||||
</component>
|
||||
@ -631,7 +624,8 @@
|
||||
<workItem from="1715389027934" duration="14410000" />
|
||||
<workItem from="1715568844617" duration="447000" />
|
||||
<workItem from="1715569361646" duration="7895000" />
|
||||
<workItem from="1715648805827" duration="24520000" />
|
||||
<workItem from="1715648805827" duration="24869000" />
|
||||
<workItem from="1715733500690" duration="26406000" />
|
||||
</task>
|
||||
<task id="LOCAL-00001" summary="第一次提交">
|
||||
<created>1623736948713</created>
|
||||
|
@ -1,11 +1,14 @@
|
||||
package com.wisdo.mmining.api.dto;
|
||||
|
||||
import com.wisdo.mmining.controller.dto.PackageDto;
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Data
|
||||
public class EditOrderAddressDto {
|
||||
private int orderId;
|
||||
private String orderAddress;
|
||||
private String logisticsName;
|
||||
private String logisticsNum;
|
||||
private List<PackageDto> logistics;
|
||||
}
|
||||
|
@ -9,6 +9,8 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
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.redis.RedisService;
|
||||
import com.wisdo.mmining.result.Result;
|
||||
@ -206,6 +208,7 @@ public class OrderController {
|
||||
modelAndView.addObject("orderId", orderId);
|
||||
modelAndView.addObject("type", type);
|
||||
modelAndView.addObject("order", order);
|
||||
modelAndView.addObject("logistics", order.getLogistics());
|
||||
return modelAndView;
|
||||
}
|
||||
|
||||
@ -216,11 +219,17 @@ public class OrderController {
|
||||
return new ModelAndView("sys/error");
|
||||
}
|
||||
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二级弹出层
|
||||
ModelAndView modelAndView = new ModelAndView("pages/order/order_edit_address");
|
||||
modelAndView.addObject("orderId", orderId);
|
||||
modelAndView.addObject("type", type);
|
||||
modelAndView.addObject("order", order);
|
||||
modelAndView.addObject("logistics", order.getLogistics());
|
||||
return modelAndView;
|
||||
}
|
||||
|
||||
@ -548,21 +557,24 @@ public class OrderController {
|
||||
}
|
||||
|
||||
|
||||
@RequestMapping(value = "deliverGoods")
|
||||
@PostMapping(value = "deliverGoods")
|
||||
@ResponseBody
|
||||
public Result deliverGoods(Long orderId, String logisticsName, String logisticsNum) {
|
||||
if (orderId == null || com.alibaba.druid.util.StringUtils.isEmpty(logisticsName) || StringUtils.isEmpty(logisticsNum)) {
|
||||
public Result deliverGoods(@RequestBody LogisticsDto logisticsDto) throws JsonProcessingException {
|
||||
if (logisticsDto.getOrderId() == null || com.alibaba.druid.util.StringUtils.isEmpty(logisticsDto.getLogisticsName()) || logisticsDto.getPackages().isEmpty()) {
|
||||
return new Result(ResultUtil.ERROR, "参数为空");
|
||||
}
|
||||
WisdOeder order = orderService.getById(orderId);
|
||||
WisdOeder order = orderService.getById(logisticsDto.getOrderId());
|
||||
if (order == null) {
|
||||
return new Result(ResultUtil.ERROR, ResultUtil.ERROR_MSG);
|
||||
}
|
||||
if (!order.getStatus().equals(2)) {
|
||||
return new Result(ResultUtil.ERROR, "该状态无法发货");
|
||||
}
|
||||
order.setLogisticsName(logisticsName);
|
||||
order.setLogisticsNum(logisticsNum);
|
||||
ObjectMapper mapper = new ObjectMapper();
|
||||
String deliverGoodsJson = mapper.writeValueAsString(logisticsDto.getPackages());
|
||||
order.setLogistics(deliverGoodsJson);
|
||||
order.setLogisticsName(logisticsDto.getLogisticsName());
|
||||
// order.setLogisticsNum(logisticsNum);
|
||||
order.setStatus(3);
|
||||
order.setOrderDeliverTime(new Date());
|
||||
Boolean flag = orderService.updateById(order);
|
||||
@ -576,19 +588,21 @@ public class OrderController {
|
||||
|
||||
|
||||
// 处理修改地址申请
|
||||
@RequestMapping(value = "approvalUpdateAddress")
|
||||
@PostMapping(value = "approvalUpdateAddress")
|
||||
@ResponseBody
|
||||
public Result approvalUpdateAddress(Long orderId, Integer type, String logisticsNo /*1 同意, 0 拒绝*/) {
|
||||
WisdOeder order = orderService.getById(orderId);
|
||||
if (type.equals(1)) {
|
||||
public Result approvalUpdateAddress(@RequestBody ApprovalUpdateAddressDto addressDto) throws JsonProcessingException {
|
||||
WisdOeder order = orderService.getById(addressDto.getOrderId());
|
||||
if (addressDto.getType().equals(1)) {
|
||||
order.setOrderAddress(order.getPendingApprovalOrderAddress());
|
||||
order.setAddressId(order.getPendingApprovalAddressId());
|
||||
order.setLogisticsNum(logisticsNo);
|
||||
ObjectMapper mapper = new ObjectMapper();
|
||||
String deliverGoodsJson = mapper.writeValueAsString(addressDto.getLogistics());
|
||||
order.setLogistics(deliverGoodsJson);
|
||||
order.setPendingApprovalAddressId(null);
|
||||
order.setPendingApprovalOrderAddress(null);
|
||||
orderService.updateById(order);
|
||||
return ResultUtil.success("收货地址已更新");
|
||||
} else if (type.equals(0)) {
|
||||
} else if (addressDto.getType().equals(0)) {
|
||||
order.setPendingApprovalAddressId(null);
|
||||
order.setPendingApprovalOrderAddress(null);
|
||||
return ResultUtil.success("已拒绝修改地址");
|
||||
@ -599,10 +613,12 @@ public class OrderController {
|
||||
|
||||
@PostMapping(value = "editAddress")
|
||||
@ResponseBody
|
||||
public Result editAddress(@RequestBody EditOrderAddressDto address) {
|
||||
public Result editAddress(@RequestBody EditOrderAddressDto address) throws JsonProcessingException {
|
||||
WisdOeder order = orderService.getById(address.getOrderId());
|
||||
ObjectMapper mapper = new ObjectMapper();
|
||||
String deliverGoodsJson = mapper.writeValueAsString(address.getLogistics());
|
||||
order.setLogistics(deliverGoodsJson);
|
||||
order.setOrderAddress(address.getOrderAddress());
|
||||
order.setLogisticsNum(address.getLogisticsNum());
|
||||
order.setLogisticsName(address.getLogisticsName());
|
||||
orderService.updateById(order);
|
||||
return ResultUtil.success("地址修改成功");
|
||||
|
@ -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;
|
||||
}
|
@ -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;
|
||||
}
|
@ -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;
|
||||
}
|
@ -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;
|
||||
}
|
@ -1,7 +1,7 @@
|
||||
#开发环境
|
||||
spring:
|
||||
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
|
||||
username: yshop
|
||||
# username: root
|
||||
|
@ -15,10 +15,144 @@
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||||
<meta name="viewport"
|
||||
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>
|
||||
<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">
|
||||
<form class="layui-form" id="formData" lay-filter="formData">
|
||||
<input type="hidden" id="type" value="${type}">
|
||||
@ -37,13 +171,19 @@
|
||||
placeholder="请输入物流公司" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item formItem">
|
||||
<label for="logisticsNum" class="layui-form-label">物流单号</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" id="logisticsNum" name="logisticsNum" value="${order.logisticsNum}"
|
||||
placeholder="请输入物流单号" autocomplete="off" class="layui-input">
|
||||
|
||||
<c:forEach items="${packages}" var="item">
|
||||
<div>
|
||||
<div class="layui-form-item formItem">
|
||||
<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>
|
||||
</c:forEach>
|
||||
|
||||
<div class="layui-form-item formItem">
|
||||
<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;"
|
||||
@ -105,6 +245,6 @@
|
||||
return false;
|
||||
});
|
||||
})
|
||||
</script>
|
||||
</script>--%>
|
||||
</body>
|
||||
</html>
|
||||
|
@ -541,7 +541,7 @@
|
||||
layer.open({
|
||||
title: "处理发货地址修改申请",
|
||||
content: root + "/order/getUpdateAddress?type=1&orderId=" + data.id,
|
||||
area: ['500px', '300px'],
|
||||
area: ['700px', '600px'],
|
||||
offset: '20%',
|
||||
type: 2,
|
||||
})
|
||||
@ -549,7 +549,7 @@
|
||||
layer.open({
|
||||
title: "修改地址",
|
||||
content: root + "/order/getEditAddress?type=1&orderId=" + data.id,
|
||||
area: ['500px', '300px'],
|
||||
area: ['700px', '600px'],
|
||||
offset: '20%',
|
||||
type: 2,
|
||||
})
|
||||
|
@ -10,24 +10,39 @@
|
||||
|
||||
<%-- <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">--%>
|
||||
<script crossorigin src="https://unpkg.com/react@18/umd/react.development.js"></script>
|
||||
<%-- <script src="${root}/static/core/js/react/react.production.min.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 crossorigin src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script>--%>
|
||||
<%-- <script crossorigin src="https://unpkg.com/react@18/umd/react.development.js"></script>--%>
|
||||
|
||||
<script src="${root}/static/core/js/base/tailwindcss.js"></script>
|
||||
<script>
|
||||
const orderId = ${orderId};
|
||||
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>
|
||||
</head>
|
||||
<body>
|
||||
<body style="background-color: white">
|
||||
<div id="root"></div>
|
||||
<script type="text/babel">
|
||||
const {useState} = React
|
||||
|
||||
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 [logisticsName, setLogisticsName] = useState("")
|
||||
const [activePackage, setActivePackage] = useState(0)
|
||||
return <div>
|
||||
<div className="p-2 flex">
|
||||
@ -50,14 +65,21 @@
|
||||
<button className="layui-btn layui-btn-xs" onClick={() => {
|
||||
// TODO: STEP1: 将商品添加到 packages 中
|
||||
const _packages = [...packages]
|
||||
_packages[activePackage].goods.push({
|
||||
name: goods.goodsName,
|
||||
num: goods.goodsNum
|
||||
})
|
||||
const goodsInPackageIndex = _packages[activePackage].goods.findIndex(el => el.id === goods.id)
|
||||
if (goodsInPackageIndex !== -1) {
|
||||
_packages[activePackage].goods[goodsInPackageIndex].num += 1
|
||||
} else {
|
||||
_packages[activePackage].goods.push({
|
||||
id: goods.id,
|
||||
name: goods.goodsName,
|
||||
num: 1
|
||||
})
|
||||
}
|
||||
setPackages(_packages)
|
||||
// TODO: STEP2: 在 goodsList 中扣除已添加的商品数量 goodsNum
|
||||
const _goodsList = [...goodsList]
|
||||
_goodsList.find(el => el.id === goods.id).goodsNum -= 1
|
||||
|
||||
setGoodsList(_goodsList)
|
||||
}}>
|
||||
添加到包裹
|
||||
</button>
|
||||
@ -74,7 +96,9 @@
|
||||
<div className="layui-form-item">
|
||||
<label className="layui-form-label w-[100px]">物流名称</label>
|
||||
<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="请输入物流公司名称"
|
||||
autoComplete="off" className="layui-input"/>
|
||||
</div>
|
||||
@ -82,7 +106,7 @@
|
||||
{
|
||||
packages.map((pack, index) => <div key={pack.id}
|
||||
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,
|
||||
}}
|
||||
onClick={() => {
|
||||
@ -92,25 +116,75 @@
|
||||
<div className="absolute left-4 -top-3 bg-white">包裹{index + 1}</div>
|
||||
{packages.length > 1 && < button type="button"
|
||||
onClick={() => {
|
||||
if (index === activePackage) {
|
||||
// TODO: WHY
|
||||
setTimeout(() => {
|
||||
setActivePackage(state => state - 1)
|
||||
}, 0)
|
||||
}
|
||||
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">
|
||||
<i className="layui-icon layui-icon-close text-white"></i>
|
||||
</button>}
|
||||
<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">
|
||||
<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="请输入运单号"
|
||||
autoComplete="off" className="layui-input"/>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
{
|
||||
pack.goods.map(goods => <div key={goods.goodsName}>
|
||||
{goods.name}
|
||||
</div>)
|
||||
}
|
||||
<div className="pl-2">
|
||||
<table className="layui-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<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>)
|
||||
}
|
||||
@ -118,9 +192,11 @@
|
||||
setPackages(state => {
|
||||
return [...state, {
|
||||
id: Date.now(),
|
||||
logisticsNumber: "",
|
||||
goods: []
|
||||
}]
|
||||
})
|
||||
setActivePackage(packages.length)
|
||||
}}>添加包裹
|
||||
</button>
|
||||
</form>
|
||||
@ -128,13 +204,86 @@
|
||||
</div>
|
||||
</div>
|
||||
<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>
|
||||
}
|
||||
const container = document.getElementById("root")
|
||||
const root = ReactDOM.createRoot(container);
|
||||
root.render(<App/>);
|
||||
const rootApp = ReactDOM.createRoot(container);
|
||||
rootApp.render(<App/>);
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
@ -15,9 +15,129 @@
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||||
<meta name="viewport"
|
||||
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>
|
||||
<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-row">
|
||||
<form class="layui-form" id="formData" lay-filter="formData">
|
||||
@ -93,5 +213,6 @@
|
||||
});
|
||||
})
|
||||
</script>
|
||||
--%>
|
||||
</body>
|
||||
</html>
|
||||
|
@ -20,6 +20,10 @@
|
||||
<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/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>
|
||||
var root = "${root}";
|
||||
var admin = function () {
|
||||
|
2
src/main/webapp/static/core/js/base/babel.min.js
vendored
Normal file
2
src/main/webapp/static/core/js/base/babel.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user