1、fix bug
2、完善凭证模块
This commit is contained in:
+12
@@ -0,0 +1,12 @@
|
|||||||
|
package org.springblade.transport.pojo.dto;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
/** 分片上传完成后回写凭证文件。 */
|
||||||
|
@Data
|
||||||
|
public class VoucherFileCompleteRequest {
|
||||||
|
private String voucherBatchNo;
|
||||||
|
private Long fileTaskId;
|
||||||
|
private String fileName;
|
||||||
|
private String fileUrl;
|
||||||
|
}
|
||||||
+9
@@ -139,6 +139,15 @@ public class Waybill extends TenantEntity {
|
|||||||
@Schema(description = "车/船/航班/班列号")
|
@Schema(description = "车/船/航班/班列号")
|
||||||
private String vehicleNo;
|
private String vehicleNo;
|
||||||
|
|
||||||
|
@Schema(description = "船长")
|
||||||
|
private String captainName;
|
||||||
|
|
||||||
|
@Schema(description = "舱位")
|
||||||
|
private String cabinNo;
|
||||||
|
|
||||||
|
@Schema(description = "箱号")
|
||||||
|
private String containerNo;
|
||||||
|
|
||||||
@Schema(description = "挂车车牌号")
|
@Schema(description = "挂车车牌号")
|
||||||
private String trailerVehicleNo;
|
private String trailerVehicleNo;
|
||||||
|
|
||||||
|
|||||||
+10
-3
@@ -41,9 +41,10 @@ public class FileTaskController extends BladeController {
|
|||||||
private final IFileService fileService;
|
private final IFileService fileService;
|
||||||
|
|
||||||
@GetMapping("/queryFileTask")
|
@GetMapping("/queryFileTask")
|
||||||
@Operation(summary = "根据文件的MD5值查询文件任务", description = "文件的MD5值检查分段,参数名:md5")
|
@Operation(summary = "查询文件任务", description = "传入 id 或 md5 查询文件任务")
|
||||||
public R<FileTaskUpdateVO> queryFileTask(@RequestParam(value = "md5") String md5) {
|
public R<FileTaskUpdateVO> queryFileTask(@RequestParam(required = false) Long id,
|
||||||
FileTaskUpdateVO fileTask = fileTaskService.queryFileTask(null, md5);
|
@RequestParam(value = "md5", required = false) String md5) {
|
||||||
|
FileTaskUpdateVO fileTask = fileTaskService.queryFileTask(id, md5);
|
||||||
return R.data(fileTask);
|
return R.data(fileTask);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -94,6 +95,12 @@ public class FileTaskController extends BladeController {
|
|||||||
return R.status(fileTaskService.updatePaused(param.getIds()));
|
return R.status(fileTaskService.updatePaused(param.getIds()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@PostMapping("/resume")
|
||||||
|
@Operation(summary = "恢复文件任务上传")
|
||||||
|
public R<Boolean> resume(@RequestParam Long id) {
|
||||||
|
return R.status(fileTaskService.resume(id));
|
||||||
|
}
|
||||||
|
|
||||||
@GetMapping("/getUploadUrl")
|
@GetMapping("/getUploadUrl")
|
||||||
@Parameters({
|
@Parameters({
|
||||||
@Parameter(name = "id", description = "文件任务id", in = ParameterIn.QUERY, schema = @Schema(type = "string")),
|
@Parameter(name = "id", description = "文件任务id", in = ParameterIn.QUERY, schema = @Schema(type = "string")),
|
||||||
|
|||||||
+2
@@ -94,5 +94,7 @@ public interface IFileTaskService extends IService<FileTask> {
|
|||||||
*/
|
*/
|
||||||
boolean updatePaused(List<Long> param);
|
boolean updatePaused(List<Long> param);
|
||||||
|
|
||||||
|
boolean resume(Long id);
|
||||||
|
|
||||||
IPage<FileTaskUpdateVO> selectPage(Query query, String businessType, String businessId, String attachmentName, String status);
|
IPage<FileTaskUpdateVO> selectPage(Query query, String businessType, String businessId, String attachmentName, String status);
|
||||||
}
|
}
|
||||||
|
|||||||
+18
-2
@@ -36,7 +36,6 @@ import org.springblade.core.tool.utils.CollectionUtil;
|
|||||||
import org.springblade.core.tool.utils.Func;
|
import org.springblade.core.tool.utils.Func;
|
||||||
import org.springblade.core.tool.utils.StringUtil;
|
import org.springblade.core.tool.utils.StringUtil;
|
||||||
import org.springblade.core.mp.support.Condition;
|
import org.springblade.core.mp.support.Condition;
|
||||||
import org.springblade.core.secure.utils.AuthUtil;
|
|
||||||
import org.springblade.file.config.ObsProperties;
|
import org.springblade.file.config.ObsProperties;
|
||||||
import org.springblade.file.convert.FileTaskConvert;
|
import org.springblade.file.convert.FileTaskConvert;
|
||||||
import org.springblade.file.listener.FileUploadedEvent;
|
import org.springblade.file.listener.FileUploadedEvent;
|
||||||
@@ -251,6 +250,9 @@ public class FileTaskServiceImpl extends ServiceImpl<FileTaskMapper, FileTask> i
|
|||||||
if (FileTaskStatus.COMPLETED.getCode().equals(fileTask.getStatus())) {
|
if (FileTaskStatus.COMPLETED.getCode().equals(fileTask.getStatus())) {
|
||||||
throw new ServiceException("文件任务已完成");
|
throw new ServiceException("文件任务已完成");
|
||||||
}
|
}
|
||||||
|
if (FileTaskStatus.PAUSED.getCode().equals(fileTask.getStatus())) {
|
||||||
|
throw new ServiceException("文件任务已暂停");
|
||||||
|
}
|
||||||
return fileService.getUploadPartUrl(fileTask.getObjectKey(), fileTask.getUploadId(), partNumber, null);
|
return fileService.getUploadPartUrl(fileTask.getObjectKey(), fileTask.getUploadId(), partNumber, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -322,6 +324,19 @@ public class FileTaskServiceImpl extends ServiceImpl<FileTaskMapper, FileTask> i
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean resume(Long id) {
|
||||||
|
FileTask fileTask = getById(id);
|
||||||
|
Func.requireNotNull(fileTask, "文件任务不存在");
|
||||||
|
if (FileTaskStatus.COMPLETED.getCode().equals(fileTask.getStatus())) {
|
||||||
|
throw new ServiceException("文件任务已完成");
|
||||||
|
}
|
||||||
|
FileTask updateParam = new FileTask();
|
||||||
|
updateParam.setId(id);
|
||||||
|
updateParam.setStatus(FileTaskStatus.UPLOADING.getCode());
|
||||||
|
return updateById(updateParam);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IPage<FileTaskUpdateVO> selectPage(org.springblade.core.mp.support.Query query, String businessType, String businessId, String attachmentName, String status) {
|
public IPage<FileTaskUpdateVO> selectPage(org.springblade.core.mp.support.Query query, String businessType, String businessId, String attachmentName, String status) {
|
||||||
IPage<FileTask> page = page(Condition.getPage(query), Wrappers.<FileTask>lambdaQuery()
|
IPage<FileTask> page = page(Condition.getPage(query), Wrappers.<FileTask>lambdaQuery()
|
||||||
@@ -329,7 +344,7 @@ public class FileTaskServiceImpl extends ServiceImpl<FileTaskMapper, FileTask> i
|
|||||||
.eq(StringUtil.isNotBlank(businessId), FileTask::getBusinessId, businessId)
|
.eq(StringUtil.isNotBlank(businessId), FileTask::getBusinessId, businessId)
|
||||||
.like(StringUtil.isNotBlank(attachmentName), FileTask::getAttachmentName, attachmentName)
|
.like(StringUtil.isNotBlank(attachmentName), FileTask::getAttachmentName, attachmentName)
|
||||||
.eq(StringUtil.isNotBlank(status), FileTask::getStatus, status)
|
.eq(StringUtil.isNotBlank(status), FileTask::getStatus, status)
|
||||||
.eq(FileTask::getCreateUser, AuthUtil.getUserId()).orderByDesc(FileTask::getCreateTime));
|
.orderByDesc(FileTask::getCreateTime));
|
||||||
return page.convert(this::getFileTaskUpdateVO);
|
return page.convert(this::getFileTaskUpdateVO);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -383,6 +398,7 @@ public class FileTaskServiceImpl extends ServiceImpl<FileTaskMapper, FileTask> i
|
|||||||
return this.update(updateParam, Wrappers.<FileTask>lambdaUpdate()
|
return this.update(updateParam, Wrappers.<FileTask>lambdaUpdate()
|
||||||
.eq(FileTask::getId, param.getId())
|
.eq(FileTask::getId, param.getId())
|
||||||
.lt(FileTask::getCurrentIndex, param.getPartNumber())
|
.lt(FileTask::getCurrentIndex, param.getPartNumber())
|
||||||
|
.ne(FileTask::getStatus, FileTaskStatus.PAUSED.getCode())
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+10
-2
@@ -12,6 +12,7 @@ import org.springblade.core.secure.annotation.PreAuth;
|
|||||||
import org.springblade.core.tool.api.R;
|
import org.springblade.core.tool.api.R;
|
||||||
import org.springblade.transport.pojo.dto.VoucherManageSubmitRequest;
|
import org.springblade.transport.pojo.dto.VoucherManageSubmitRequest;
|
||||||
import org.springblade.transport.pojo.dto.VoucherUploadDraftRequest;
|
import org.springblade.transport.pojo.dto.VoucherUploadDraftRequest;
|
||||||
|
import org.springblade.transport.pojo.dto.VoucherFileCompleteRequest;
|
||||||
import org.springblade.transport.pojo.entity.VoucherManage;
|
import org.springblade.transport.pojo.entity.VoucherManage;
|
||||||
import org.springblade.transport.pojo.vo.VoucherManageVO;
|
import org.springblade.transport.pojo.vo.VoucherManageVO;
|
||||||
import org.springblade.transport.service.IVoucherManageService;
|
import org.springblade.transport.service.IVoucherManageService;
|
||||||
@@ -57,6 +58,13 @@ public class VoucherManageController extends BladeController {
|
|||||||
return R.data(voucherManageService.createUploadDraft(request));
|
return R.data(voucherManageService.createUploadDraft(request));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@PostMapping("/complete-upload-file")
|
||||||
|
@Operation(summary = "回写已完成上传的凭证文件")
|
||||||
|
public R completeUploadFile(@RequestBody VoucherFileCompleteRequest request) {
|
||||||
|
voucherManageService.completeUploadFile(request);
|
||||||
|
return R.success("文件已更新");
|
||||||
|
}
|
||||||
|
|
||||||
@PostMapping("/remove")
|
@PostMapping("/remove")
|
||||||
@ApiOperationSupport(order = 5)
|
@ApiOperationSupport(order = 5)
|
||||||
@Operation(summary = "删除凭证")
|
@Operation(summary = "删除凭证")
|
||||||
@@ -65,9 +73,9 @@ public class VoucherManageController extends BladeController {
|
|||||||
@GetMapping("/waybill-batches")
|
@GetMapping("/waybill-batches")
|
||||||
@ApiOperationSupport(order = 6)
|
@ApiOperationSupport(order = 6)
|
||||||
@Operation(summary = "可关联运输批次")
|
@Operation(summary = "可关联运输批次")
|
||||||
public R<List<Map<String, Object>>> waybillBatches(@RequestParam(required = false) String batchNo,
|
public R<IPage<Map<String, Object>>> waybillBatches(Query query, @RequestParam(required = false) String batchNo,
|
||||||
@RequestParam(required = false) String createUser, @RequestParam(required = false) Integer waybillCount,
|
@RequestParam(required = false) String createUser, @RequestParam(required = false) Integer waybillCount,
|
||||||
@RequestParam(required = false) String createTimeStart, @RequestParam(required = false) String createTimeEnd) {
|
@RequestParam(required = false) String createTimeStart, @RequestParam(required = false) String createTimeEnd) {
|
||||||
return R.data(voucherManageService.selectableWaybillBatches(batchNo, createUser, waybillCount, createTimeStart, createTimeEnd));
|
return R.data(voucherManageService.selectableWaybillBatches(Condition.getPage(query), batchNo, createUser, waybillCount, createTimeStart, createTimeEnd));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+13
-1
@@ -1,6 +1,18 @@
|
|||||||
package org.springblade.transport.mapper;
|
package org.springblade.transport.mapper;
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
|
import org.apache.ibatis.annotations.Param;
|
||||||
|
import org.apache.ibatis.annotations.Select;
|
||||||
import org.springblade.transport.pojo.entity.VoucherManage;
|
import org.springblade.transport.pojo.entity.VoucherManage;
|
||||||
|
|
||||||
public interface VoucherManageMapper extends BaseMapper<VoucherManage> { }
|
public interface VoucherManageMapper extends BaseMapper<VoucherManage> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询指定租户、指定日期前缀下已使用的最大凭证流水号。
|
||||||
|
* 不过滤逻辑删除数据,避免唯一索引仍占用历史编号时重复生成。
|
||||||
|
*/
|
||||||
|
@Select("SELECT COALESCE(MAX(CAST(SUBSTRING_INDEX(voucher_batch_no, '-', -1) AS UNSIGNED)), 0) "
|
||||||
|
+ "FROM blade_voucher_manage WHERE tenant_id = #{tenantId} "
|
||||||
|
+ "AND voucher_batch_no LIKE CONCAT(#{prefix}, '%')")
|
||||||
|
Long selectMaxDailySequence(@Param("tenantId") String tenantId, @Param("prefix") String prefix);
|
||||||
|
}
|
||||||
|
|||||||
+2
-1
@@ -1,6 +1,7 @@
|
|||||||
package org.springblade.transport.mapper;
|
package org.springblade.transport.mapper;
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
import org.springblade.transport.pojo.entity.VoucherWaybillBatch;
|
import org.springblade.transport.pojo.entity.VoucherWaybillBatch;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -9,7 +10,7 @@ import java.util.Map;
|
|||||||
import org.apache.ibatis.annotations.Param;
|
import org.apache.ibatis.annotations.Param;
|
||||||
|
|
||||||
public interface VoucherWaybillBatchMapper extends BaseMapper<VoucherWaybillBatch> {
|
public interface VoucherWaybillBatchMapper extends BaseMapper<VoucherWaybillBatch> {
|
||||||
List<Map<String, Object>> selectWaybillBatches(@Param("tenantId") String tenantId, @Param("batchNo") String batchNo, @Param("createUser") String createUser,
|
IPage<Map<String, Object>> selectVoucherWaybillBatchPage(IPage<?> page, @Param("tenantId") String tenantId, @Param("batchNo") String batchNo, @Param("createUser") String createUser,
|
||||||
@Param("waybillCount") Integer waybillCount, @Param("createTimeStart") String createTimeStart, @Param("createTimeEnd") String createTimeEnd);
|
@Param("waybillCount") Integer waybillCount, @Param("createTimeStart") String createTimeStart, @Param("createTimeEnd") String createTimeEnd);
|
||||||
List<Map<String, Object>> selectWaybillBatchesByIds(@Param("tenantId") String tenantId, @Param("ids") List<Long> ids);
|
List<Map<String, Object>> selectWaybillBatchesByIds(@Param("tenantId") String tenantId, @Param("ids") List<Long> ids);
|
||||||
}
|
}
|
||||||
|
|||||||
+17
-16
@@ -1,24 +1,25 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" ?>
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||||
<mapper namespace="org.springblade.transport.mapper.VoucherWaybillBatchMapper">
|
<mapper namespace="org.springblade.transport.mapper.VoucherWaybillBatchMapper">
|
||||||
<select id="selectWaybillBatches" resultType="java.util.LinkedHashMap">
|
<select id="selectVoucherWaybillBatchPage" resultType="java.util.LinkedHashMap">
|
||||||
SELECT b.id, b.batch_no AS batchNo, b.waybill_count AS waybillCount, b.create_time AS createTime,
|
SELECT MAX(w.create_time) AS createTime, MAX(w.create_user) AS createUser,
|
||||||
b.create_user AS createUser, u.real_name AS createUserName
|
MAX(u.real_name) AS createUserName, COUNT(*) AS waybillCount,
|
||||||
FROM blade_waybill_import_batch b
|
COALESCE(NULLIF(w.batch_no, ''), '未分批运单') AS batchNo, GROUP_CONCAT(w.id ORDER BY w.create_time DESC) AS waybillIds
|
||||||
LEFT JOIN blade_user u ON u.id = b.create_user
|
FROM blade_waybill w
|
||||||
WHERE b.is_deleted = 0 AND b.tenant_id = #{tenantId}
|
LEFT JOIN blade_user u ON u.id = w.create_user
|
||||||
<if test="batchNo != null and batchNo != ''">AND b.batch_no LIKE CONCAT('%', #{batchNo}, '%')</if>
|
WHERE w.is_deleted = 0 AND w.tenant_id = #{tenantId}
|
||||||
<if test="createUser != null and createUser != ''">AND b.create_user = #{createUser}</if>
|
<if test="batchNo != null and batchNo != ''">AND w.batch_no LIKE CONCAT('%', #{batchNo}, '%')</if>
|
||||||
<if test="waybillCount != null">AND b.waybill_count = #{waybillCount}</if>
|
<if test="createUser != null and createUser != ''">AND w.create_user = #{createUser}</if>
|
||||||
<if test="createTimeStart != null and createTimeStart != ''">AND b.create_time <![CDATA[>=]]> #{createTimeStart}</if>
|
<if test="createTimeStart != null and createTimeStart != ''">AND w.create_time <![CDATA[>=]]> #{createTimeStart}</if>
|
||||||
<if test="createTimeEnd != null and createTimeEnd != ''">AND b.create_time <![CDATA[<=]]> #{createTimeEnd}</if>
|
<if test="createTimeEnd != null and createTimeEnd != ''">AND w.create_time <![CDATA[<=]]> #{createTimeEnd}</if>
|
||||||
ORDER BY b.create_time DESC
|
GROUP BY COALESCE(NULLIF(w.batch_no, ''), '未分批运单')
|
||||||
|
<if test="waybillCount != null">HAVING COUNT(*) = #{waybillCount}</if>
|
||||||
|
ORDER BY createTime DESC
|
||||||
</select>
|
</select>
|
||||||
<select id="selectWaybillBatchesByIds" resultType="java.util.LinkedHashMap">
|
<select id="selectWaybillBatchesByIds" resultType="java.util.LinkedHashMap">
|
||||||
SELECT b.id, b.batch_no AS batchNo, b.waybill_count AS waybillCount FROM blade_waybill_import_batch b
|
SELECT w.id, COALESCE(NULLIF(w.batch_no, ''), '未分批运单') AS batchNo, 1 AS waybillCount
|
||||||
INNER JOIN blade_waybill w ON w.import_batch_id = b.id AND w.is_deleted = 0
|
FROM blade_waybill w
|
||||||
WHERE b.is_deleted = 0 AND b.tenant_id = #{tenantId} AND w.id IN
|
WHERE w.is_deleted = 0 AND w.tenant_id = #{tenantId} AND w.id IN
|
||||||
<foreach collection="ids" item="id" open="(" separator="," close=")">#{id}</foreach>
|
<foreach collection="ids" item="id" open="(" separator="," close=")">#{id}</foreach>
|
||||||
GROUP BY b.id, b.batch_no, b.waybill_count
|
|
||||||
</select>
|
</select>
|
||||||
</mapper>
|
</mapper>
|
||||||
|
|||||||
+3
-1
@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
|
|||||||
import org.springblade.core.mp.base.BaseService;
|
import org.springblade.core.mp.base.BaseService;
|
||||||
import org.springblade.transport.pojo.dto.VoucherManageSubmitRequest;
|
import org.springblade.transport.pojo.dto.VoucherManageSubmitRequest;
|
||||||
import org.springblade.transport.pojo.dto.VoucherUploadDraftRequest;
|
import org.springblade.transport.pojo.dto.VoucherUploadDraftRequest;
|
||||||
|
import org.springblade.transport.pojo.dto.VoucherFileCompleteRequest;
|
||||||
import org.springblade.transport.pojo.entity.VoucherManage;
|
import org.springblade.transport.pojo.entity.VoucherManage;
|
||||||
import org.springblade.transport.pojo.vo.VoucherManageVO;
|
import org.springblade.transport.pojo.vo.VoucherManageVO;
|
||||||
|
|
||||||
@@ -15,6 +16,7 @@ public interface IVoucherManageService extends BaseService<VoucherManage> {
|
|||||||
VoucherManageVO detail(Long id);
|
VoucherManageVO detail(Long id);
|
||||||
void submit(VoucherManageSubmitRequest request);
|
void submit(VoucherManageSubmitRequest request);
|
||||||
VoucherManage createUploadDraft(VoucherUploadDraftRequest request);
|
VoucherManage createUploadDraft(VoucherUploadDraftRequest request);
|
||||||
|
void completeUploadFile(VoucherFileCompleteRequest request);
|
||||||
void removeVoucher(Long id);
|
void removeVoucher(Long id);
|
||||||
List<Map<String, Object>> selectableWaybillBatches(String batchNo, String createUser, Integer waybillCount, String createTimeStart, String createTimeEnd);
|
IPage<Map<String, Object>> selectableWaybillBatches(IPage<?> page, String batchNo, String createUser, Integer waybillCount, String createTimeStart, String createTimeEnd);
|
||||||
}
|
}
|
||||||
|
|||||||
+23
-6
@@ -11,6 +11,7 @@ import org.springblade.transport.mapper.VoucherManageMapper;
|
|||||||
import org.springblade.transport.mapper.VoucherWaybillBatchMapper;
|
import org.springblade.transport.mapper.VoucherWaybillBatchMapper;
|
||||||
import org.springblade.transport.pojo.dto.VoucherManageSubmitRequest;
|
import org.springblade.transport.pojo.dto.VoucherManageSubmitRequest;
|
||||||
import org.springblade.transport.pojo.dto.VoucherUploadDraftRequest;
|
import org.springblade.transport.pojo.dto.VoucherUploadDraftRequest;
|
||||||
|
import org.springblade.transport.pojo.dto.VoucherFileCompleteRequest;
|
||||||
import org.springblade.transport.pojo.entity.VoucherManage;
|
import org.springblade.transport.pojo.entity.VoucherManage;
|
||||||
import org.springblade.transport.pojo.entity.VoucherWaybillBatch;
|
import org.springblade.transport.pojo.entity.VoucherWaybillBatch;
|
||||||
import org.springblade.transport.pojo.entity.ProjectApply;
|
import org.springblade.transport.pojo.entity.ProjectApply;
|
||||||
@@ -80,7 +81,7 @@ public class VoucherManageServiceImpl extends BaseServiceImpl<VoucherManageMappe
|
|||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public void submit(VoucherManageSubmitRequest request) {
|
public void submit(VoucherManageSubmitRequest request) {
|
||||||
if (Func.isEmpty(request.getProjectId())) throw new ServiceException("请选择项目名称");
|
if (Func.isEmpty(request.getProjectId())) throw new ServiceException("请选择项目名称");
|
||||||
if (Func.isEmpty(request.getFileName()) || Func.isEmpty(request.getFileUrl())) throw new ServiceException("请上传执行凭证压缩包");
|
if (Func.isEmpty(request.getFileName()) || (Func.isEmpty(request.getFileUrl()) && Func.isEmpty(request.getFileTaskId()))) throw new ServiceException("请上传执行凭证压缩包");
|
||||||
if (Func.isEmpty(request.getWaybillImportBatchIds())) throw new ServiceException("请至少关联一个运输批次");
|
if (Func.isEmpty(request.getWaybillImportBatchIds())) throw new ServiceException("请至少关联一个运输批次");
|
||||||
VoucherManage voucher = Func.isEmpty(request.getId()) ? new VoucherManage() : getById(request.getId());
|
VoucherManage voucher = Func.isEmpty(request.getId()) ? new VoucherManage() : getById(request.getId());
|
||||||
if (voucher == null) throw new ServiceException("凭证批次不存在");
|
if (voucher == null) throw new ServiceException("凭证批次不存在");
|
||||||
@@ -112,13 +113,29 @@ public class VoucherManageServiceImpl extends BaseServiceImpl<VoucherManageMappe
|
|||||||
relations.add(relation);
|
relations.add(relation);
|
||||||
}
|
}
|
||||||
relations.forEach(voucherWaybillBatchMapper::insert);
|
relations.forEach(voucherWaybillBatchMapper::insert);
|
||||||
voucher.setWaybillBatchNo(relations.stream().map(VoucherWaybillBatch::getWaybillBatchNo).collect(Collectors.joining(",")));
|
voucher.setWaybillBatchNo(relations.stream().map(VoucherWaybillBatch::getWaybillBatchNo).distinct().collect(Collectors.joining(",")));
|
||||||
int total = relations.stream().mapToInt(VoucherWaybillBatch::getWaybillCount).sum();
|
int total = relations.stream().mapToInt(VoucherWaybillBatch::getWaybillCount).sum();
|
||||||
voucher.setRelatedWaybillCount(total);
|
voucher.setRelatedWaybillCount(total);
|
||||||
voucher.setUnRelatedWaybillCount(0);
|
voucher.setUnRelatedWaybillCount(0);
|
||||||
updateById(voucher);
|
updateById(voucher);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
|
public void completeUploadFile(VoucherFileCompleteRequest request) {
|
||||||
|
if (Func.isEmpty(request.getVoucherBatchNo()) || Func.isEmpty(request.getFileTaskId()) || Func.isEmpty(request.getFileUrl())) {
|
||||||
|
throw new ServiceException("凭证文件信息不完整");
|
||||||
|
}
|
||||||
|
VoucherManage voucher = getOne(Wrappers.<VoucherManage>lambdaQuery()
|
||||||
|
.eq(VoucherManage::getVoucherBatchNo, request.getVoucherBatchNo())
|
||||||
|
.eq(VoucherManage::getIsDeleted, 0).last("limit 1"));
|
||||||
|
if (voucher == null) throw new ServiceException("凭证批次不存在");
|
||||||
|
voucher.setFileTaskId(request.getFileTaskId());
|
||||||
|
voucher.setFileName(request.getFileName());
|
||||||
|
voucher.setFileUrl(request.getFileUrl());
|
||||||
|
updateById(voucher);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public void removeVoucher(Long id) {
|
public void removeVoucher(Long id) {
|
||||||
@@ -129,8 +146,8 @@ public class VoucherManageServiceImpl extends BaseServiceImpl<VoucherManageMappe
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<Map<String, Object>> selectableWaybillBatches(String batchNo, String createUser, Integer waybillCount, String createTimeStart, String createTimeEnd) {
|
public IPage<Map<String, Object>> selectableWaybillBatches(IPage<?> page, String batchNo, String createUser, Integer waybillCount, String createTimeStart, String createTimeEnd) {
|
||||||
return voucherWaybillBatchMapper.selectWaybillBatches(AuthUtil.getTenantId(), batchNo, createUser, waybillCount, createTimeStart, createTimeEnd);
|
return voucherWaybillBatchMapper.selectVoucherWaybillBatchPage(page, AuthUtil.getTenantId(), batchNo, createUser, waybillCount, createTimeStart, createTimeEnd);
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<Map<String, Object>> selectableWaybillBatchesByIds(List<Long> ids) {
|
private List<Map<String, Object>> selectableWaybillBatchesByIds(List<Long> ids) {
|
||||||
@@ -153,7 +170,7 @@ public class VoucherManageServiceImpl extends BaseServiceImpl<VoucherManageMappe
|
|||||||
|
|
||||||
private synchronized String nextCode() {
|
private synchronized String nextCode() {
|
||||||
String prefix = "PZ" + java.time.LocalDate.now().format(DateTimeFormatter.BASIC_ISO_DATE) + "-";
|
String prefix = "PZ" + java.time.LocalDate.now().format(DateTimeFormatter.BASIC_ISO_DATE) + "-";
|
||||||
long count = count(Wrappers.<VoucherManage>lambdaQuery().likeRight(VoucherManage::getVoucherBatchNo, prefix));
|
Long maxSequence = baseMapper.selectMaxDailySequence(AuthUtil.getTenantId(), prefix);
|
||||||
return prefix + String.format("%03d", count + 1);
|
return prefix + String.format("%03d", (maxSequence == null ? 0 : maxSequence) + 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+30
-2
@@ -186,6 +186,9 @@ public class WaybillServiceImpl extends BaseServiceImpl<WaybillMapper, Waybill>
|
|||||||
target.setDriverName(source.getDriverName());
|
target.setDriverName(source.getDriverName());
|
||||||
target.setDriverPhone(source.getDriverPhone());
|
target.setDriverPhone(source.getDriverPhone());
|
||||||
target.setVehicleNo(source.getVehicleNo());
|
target.setVehicleNo(source.getVehicleNo());
|
||||||
|
target.setCaptainName(source.getCaptainName());
|
||||||
|
target.setCabinNo(source.getCabinNo());
|
||||||
|
target.setContainerNo(source.getContainerNo());
|
||||||
target.setTrailerVehicleNo(source.getTrailerVehicleNo());
|
target.setTrailerVehicleNo(source.getTrailerVehicleNo());
|
||||||
target.setEscortName(source.getEscortName());
|
target.setEscortName(source.getEscortName());
|
||||||
target.setEscortPhone(source.getEscortPhone());
|
target.setEscortPhone(source.getEscortPhone());
|
||||||
@@ -382,6 +385,9 @@ public class WaybillServiceImpl extends BaseServiceImpl<WaybillMapper, Waybill>
|
|||||||
waybill.setDriverName(TransportBusinessSupport.trimToNull(waybill.getDriverName()));
|
waybill.setDriverName(TransportBusinessSupport.trimToNull(waybill.getDriverName()));
|
||||||
waybill.setDriverPhone(TransportBusinessSupport.trimToNull(waybill.getDriverPhone()));
|
waybill.setDriverPhone(TransportBusinessSupport.trimToNull(waybill.getDriverPhone()));
|
||||||
waybill.setVehicleNo(TransportBusinessSupport.trimToNull(waybill.getVehicleNo()));
|
waybill.setVehicleNo(TransportBusinessSupport.trimToNull(waybill.getVehicleNo()));
|
||||||
|
waybill.setCaptainName(TransportBusinessSupport.trimToNull(waybill.getCaptainName()));
|
||||||
|
waybill.setCabinNo(TransportBusinessSupport.trimToNull(waybill.getCabinNo()));
|
||||||
|
waybill.setContainerNo(TransportBusinessSupport.trimToNull(waybill.getContainerNo()));
|
||||||
waybill.setTrailerVehicleNo(TransportBusinessSupport.trimToNull(waybill.getTrailerVehicleNo()));
|
waybill.setTrailerVehicleNo(TransportBusinessSupport.trimToNull(waybill.getTrailerVehicleNo()));
|
||||||
waybill.setEscortName(TransportBusinessSupport.trimToNull(waybill.getEscortName()));
|
waybill.setEscortName(TransportBusinessSupport.trimToNull(waybill.getEscortName()));
|
||||||
waybill.setEscortPhone(TransportBusinessSupport.trimToNull(waybill.getEscortPhone()));
|
waybill.setEscortPhone(TransportBusinessSupport.trimToNull(waybill.getEscortPhone()));
|
||||||
@@ -422,13 +428,15 @@ public class WaybillServiceImpl extends BaseServiceImpl<WaybillMapper, Waybill>
|
|||||||
TransportBusinessSupport.validateRequired(waybill.getCargoType(), "货物类型不能为空");
|
TransportBusinessSupport.validateRequired(waybill.getCargoType(), "货物类型不能为空");
|
||||||
TransportBusinessSupport.validateRequired(waybill.getQuantityUnit(), "数量单位不能为空");
|
TransportBusinessSupport.validateRequired(waybill.getQuantityUnit(), "数量单位不能为空");
|
||||||
TransportBusinessSupport.validateRequired(waybill.getCarrierType(), "承运类型不能为空");
|
TransportBusinessSupport.validateRequired(waybill.getCarrierType(), "承运类型不能为空");
|
||||||
TransportBusinessSupport.validateRequired(waybill.getVehicleNo(), "车牌号不能为空");
|
TransportBusinessSupport.validateRequired(
|
||||||
|
waybill.getVehicleNo(), isRoadTransport(waybill.getTransportType()) ? "车牌号不能为空" : "船/航/班列号不能为空"
|
||||||
|
);
|
||||||
|
if (isRoadTransport(waybill.getTransportType())) {
|
||||||
if ("承运商".equals(waybill.getCarrierType())) {
|
if ("承运商".equals(waybill.getCarrierType())) {
|
||||||
TransportBusinessSupport.validateRequired(waybill.getCarrierName(), "承运商不能为空");
|
TransportBusinessSupport.validateRequired(waybill.getCarrierName(), "承运商不能为空");
|
||||||
} else {
|
} else {
|
||||||
TransportBusinessSupport.validateRequired(waybill.getDriverName(), "司机不能为空");
|
TransportBusinessSupport.validateRequired(waybill.getDriverName(), "司机不能为空");
|
||||||
TransportBusinessSupport.validateRequired(waybill.getDriverPhone(), "司机手机号不能为空");
|
TransportBusinessSupport.validateRequired(waybill.getDriverPhone(), "司机手机号不能为空");
|
||||||
if (!isRoadTransport(waybill.getTransportType())) {
|
|
||||||
TransportBusinessSupport.validateRequired(waybill.getTrailerVehicleNo(), "挂车车牌号不能为空");
|
TransportBusinessSupport.validateRequired(waybill.getTrailerVehicleNo(), "挂车车牌号不能为空");
|
||||||
TransportBusinessSupport.validateRequired(waybill.getEscortName(), "押运人不能为空");
|
TransportBusinessSupport.validateRequired(waybill.getEscortName(), "押运人不能为空");
|
||||||
TransportBusinessSupport.validateRequired(waybill.getEscortPhone(), "押运人手机号不能为空");
|
TransportBusinessSupport.validateRequired(waybill.getEscortPhone(), "押运人手机号不能为空");
|
||||||
@@ -465,6 +473,9 @@ public class WaybillServiceImpl extends BaseServiceImpl<WaybillMapper, Waybill>
|
|||||||
TransportBusinessSupport.validateLength(waybill.getDriverName(), 255, "司机姓名不能超过255字");
|
TransportBusinessSupport.validateLength(waybill.getDriverName(), 255, "司机姓名不能超过255字");
|
||||||
TransportBusinessSupport.validateLength(waybill.getDriverPhone(), 50, "司机手机号不能超过50字");
|
TransportBusinessSupport.validateLength(waybill.getDriverPhone(), 50, "司机手机号不能超过50字");
|
||||||
TransportBusinessSupport.validateLength(waybill.getVehicleNo(), 255, "车/船/航班/班列号不能超过255字");
|
TransportBusinessSupport.validateLength(waybill.getVehicleNo(), 255, "车/船/航班/班列号不能超过255字");
|
||||||
|
TransportBusinessSupport.validateLength(waybill.getCaptainName(), 20, "船长不能超过20字");
|
||||||
|
TransportBusinessSupport.validateLength(waybill.getCabinNo(), 30, "舱位不能超过30字");
|
||||||
|
TransportBusinessSupport.validateLength(waybill.getContainerNo(), 30, "箱号不能超过30字");
|
||||||
TransportBusinessSupport.validateLength(waybill.getTrailerVehicleNo(), 255, "挂车车牌号不能超过255字");
|
TransportBusinessSupport.validateLength(waybill.getTrailerVehicleNo(), 255, "挂车车牌号不能超过255字");
|
||||||
TransportBusinessSupport.validateLength(waybill.getEscortName(), 255, "押运人不能超过255字");
|
TransportBusinessSupport.validateLength(waybill.getEscortName(), 255, "押运人不能超过255字");
|
||||||
TransportBusinessSupport.validateLength(waybill.getEscortPhone(), 50, "押运人手机号不能超过50字");
|
TransportBusinessSupport.validateLength(waybill.getEscortPhone(), 50, "押运人手机号不能超过50字");
|
||||||
@@ -496,6 +507,7 @@ public class WaybillServiceImpl extends BaseServiceImpl<WaybillMapper, Waybill>
|
|||||||
TransportBusinessSupport.validateNonNegative(waybill.getUnitPrice(), "单价");
|
TransportBusinessSupport.validateNonNegative(waybill.getUnitPrice(), "单价");
|
||||||
TransportBusinessSupport.validateNonNegative(waybill.getOtherFeeTotal(), "其他费用合计");
|
TransportBusinessSupport.validateNonNegative(waybill.getOtherFeeTotal(), "其他费用合计");
|
||||||
validateRoadTaskInfo(waybill);
|
validateRoadTaskInfo(waybill);
|
||||||
|
validateNonRoadTaskInfo(waybill);
|
||||||
TransportBusinessSupport.validateDateRange(waybill.getStartDate(), waybill.getEndDate(), "开始日期不能晚于结束日期");
|
TransportBusinessSupport.validateDateRange(waybill.getStartDate(), waybill.getEndDate(), "开始日期不能晚于结束日期");
|
||||||
if (waybill.getEstimatedStartTime() != null
|
if (waybill.getEstimatedStartTime() != null
|
||||||
&& waybill.getEstimatedEndTime() != null
|
&& waybill.getEstimatedEndTime() != null
|
||||||
@@ -542,6 +554,16 @@ public class WaybillServiceImpl extends BaseServiceImpl<WaybillMapper, Waybill>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void validateNonRoadTaskInfo(Waybill waybill) {
|
||||||
|
if (isRoadTransport(waybill.getTransportType())) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
TransportBusinessSupport.validateLength(waybill.getVehicleNo(), 30, "船/航/班列号不能超过30字");
|
||||||
|
TransportBusinessSupport.validateLength(waybill.getCaptainName(), 20, "船长不能超过20字");
|
||||||
|
TransportBusinessSupport.validateLength(waybill.getCabinNo(), 30, "舱位不能超过30字");
|
||||||
|
TransportBusinessSupport.validateLength(waybill.getContainerNo(), 30, "箱号不能超过30字");
|
||||||
|
}
|
||||||
|
|
||||||
private boolean isRoadTransport(String transportType) {
|
private boolean isRoadTransport(String transportType) {
|
||||||
String value = transportType == null ? "" : transportType.toLowerCase();
|
String value = transportType == null ? "" : transportType.toLowerCase();
|
||||||
return value.contains("公路") || value.contains("道路") || value.contains("road") || "gl".equals(value);
|
return value.contains("公路") || value.contains("道路") || value.contains("road") || "gl".equals(value);
|
||||||
@@ -590,6 +612,9 @@ public class WaybillServiceImpl extends BaseServiceImpl<WaybillMapper, Waybill>
|
|||||||
putIfNotEmpty(carrier, "driverName", waybill.getDriverName());
|
putIfNotEmpty(carrier, "driverName", waybill.getDriverName());
|
||||||
putIfNotEmpty(carrier, "driverPhone", waybill.getDriverPhone());
|
putIfNotEmpty(carrier, "driverPhone", waybill.getDriverPhone());
|
||||||
putIfNotEmpty(carrier, "vehicleNo", waybill.getVehicleNo());
|
putIfNotEmpty(carrier, "vehicleNo", waybill.getVehicleNo());
|
||||||
|
putIfNotEmpty(carrier, "captainName", waybill.getCaptainName());
|
||||||
|
putIfNotEmpty(carrier, "cabinNo", waybill.getCabinNo());
|
||||||
|
putIfNotEmpty(carrier, "containerNo", waybill.getContainerNo());
|
||||||
putIfNotEmpty(carrier, "trailerVehicleNo", waybill.getTrailerVehicleNo());
|
putIfNotEmpty(carrier, "trailerVehicleNo", waybill.getTrailerVehicleNo());
|
||||||
putIfNotEmpty(carrier, "escortName", waybill.getEscortName());
|
putIfNotEmpty(carrier, "escortName", waybill.getEscortName());
|
||||||
putIfNotEmpty(carrier, "escortPhone", waybill.getEscortPhone());
|
putIfNotEmpty(carrier, "escortPhone", waybill.getEscortPhone());
|
||||||
@@ -630,6 +655,9 @@ public class WaybillServiceImpl extends BaseServiceImpl<WaybillMapper, Waybill>
|
|||||||
putIfNotEmpty(taskInfo, "driverName", waybill.getDriverName());
|
putIfNotEmpty(taskInfo, "driverName", waybill.getDriverName());
|
||||||
putIfNotEmpty(taskInfo, "driverPhone", waybill.getDriverPhone());
|
putIfNotEmpty(taskInfo, "driverPhone", waybill.getDriverPhone());
|
||||||
putIfNotEmpty(taskInfo, "vehicleNo", waybill.getVehicleNo());
|
putIfNotEmpty(taskInfo, "vehicleNo", waybill.getVehicleNo());
|
||||||
|
putIfNotEmpty(taskInfo, "captainName", waybill.getCaptainName());
|
||||||
|
putIfNotEmpty(taskInfo, "cabinNo", waybill.getCabinNo());
|
||||||
|
putIfNotEmpty(taskInfo, "containerNo", waybill.getContainerNo());
|
||||||
putIfNotEmpty(taskInfo, "trailerVehicleNo", waybill.getTrailerVehicleNo());
|
putIfNotEmpty(taskInfo, "trailerVehicleNo", waybill.getTrailerVehicleNo());
|
||||||
putIfNotEmpty(taskInfo, "escortName", waybill.getEscortName());
|
putIfNotEmpty(taskInfo, "escortName", waybill.getEscortName());
|
||||||
putIfNotEmpty(taskInfo, "escortPhone", waybill.getEscortPhone());
|
putIfNotEmpty(taskInfo, "escortPhone", waybill.getEscortPhone());
|
||||||
|
|||||||
@@ -0,0 +1,37 @@
|
|||||||
|
-- 文件服务当前使用 transport 数据库时必须执行。
|
||||||
|
-- 文件上传任务在返回结果及完成事件中会查询该表;未启用压缩包解压业务时表中不会产生数据。
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS `blade_business_unzip_task` (
|
||||||
|
`id` bigint NOT NULL COMMENT '主键ID',
|
||||||
|
`biz_id` bigint DEFAULT NULL COMMENT '业务ID',
|
||||||
|
`department_id` bigint DEFAULT NULL COMMENT '部门ID',
|
||||||
|
`biz_code` varchar(100) DEFAULT NULL COMMENT '业务编码',
|
||||||
|
`doc_code` varchar(100) DEFAULT NULL COMMENT '文档编号',
|
||||||
|
`relate_type` varchar(30) DEFAULT NULL COMMENT '关联类型:file_task、attachment',
|
||||||
|
`relate_id` bigint DEFAULT NULL COMMENT '关联ID:文件任务ID或附件ID',
|
||||||
|
`status` varchar(30) DEFAULT NULL COMMENT '状态:uploading、uploaded、unzipping、finished、failed',
|
||||||
|
`tenant_id` varchar(12) NOT NULL DEFAULT '000000' COMMENT '租户ID',
|
||||||
|
`create_user` bigint DEFAULT NULL COMMENT '创建人',
|
||||||
|
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
|
||||||
|
`update_user` bigint DEFAULT NULL COMMENT '更新人',
|
||||||
|
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
|
||||||
|
`is_deleted` tinyint NOT NULL DEFAULT 0 COMMENT '是否删除:0否、1是',
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
|
KEY `idx_business_unzip_task_relate_id` (`relate_id`),
|
||||||
|
KEY `idx_business_unzip_task_biz_id` (`biz_id`),
|
||||||
|
KEY `idx_business_unzip_task_status` (`status`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='业务解压任务';
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS `blade_business_unzip_detail` (
|
||||||
|
`id` bigint NOT NULL COMMENT '主键ID',
|
||||||
|
`business_unzip_task_id` bigint NOT NULL COMMENT '业务解压任务ID',
|
||||||
|
`attachment_id` bigint NOT NULL COMMENT '附件ID',
|
||||||
|
`create_user` bigint DEFAULT NULL COMMENT '创建人',
|
||||||
|
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
|
||||||
|
`update_user` bigint DEFAULT NULL COMMENT '更新人',
|
||||||
|
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
|
||||||
|
`is_deleted` tinyint NOT NULL DEFAULT 0 COMMENT '是否删除:0否、1是',
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
|
KEY `idx_business_unzip_detail_task_id` (`business_unzip_task_id`),
|
||||||
|
KEY `idx_business_unzip_detail_attachment_id` (`attachment_id`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='业务解压明细';
|
||||||
@@ -243,6 +243,9 @@ CREATE TABLE `blade_waybill` (
|
|||||||
`driver_name` varchar(100) DEFAULT NULL COMMENT '司机姓名',
|
`driver_name` varchar(100) DEFAULT NULL COMMENT '司机姓名',
|
||||||
`driver_phone` varchar(50) DEFAULT NULL COMMENT '司机手机号',
|
`driver_phone` varchar(50) DEFAULT NULL COMMENT '司机手机号',
|
||||||
`vehicle_no` varchar(100) DEFAULT NULL COMMENT '车/船/航班/班列号',
|
`vehicle_no` varchar(100) DEFAULT NULL COMMENT '车/船/航班/班列号',
|
||||||
|
`captain_name` varchar(20) DEFAULT NULL COMMENT '船长',
|
||||||
|
`cabin_no` varchar(30) DEFAULT NULL COMMENT '舱位',
|
||||||
|
`container_no` varchar(30) DEFAULT NULL COMMENT '箱号',
|
||||||
`trailer_vehicle_no` varchar(100) DEFAULT NULL COMMENT '挂车车牌号',
|
`trailer_vehicle_no` varchar(100) DEFAULT NULL COMMENT '挂车车牌号',
|
||||||
`escort_name` varchar(100) DEFAULT NULL COMMENT '押运人',
|
`escort_name` varchar(100) DEFAULT NULL COMMENT '押运人',
|
||||||
`escort_phone` varchar(50) DEFAULT NULL COMMENT '押运人手机号',
|
`escort_phone` varchar(50) DEFAULT NULL COMMENT '押运人手机号',
|
||||||
|
|||||||
@@ -0,0 +1,4 @@
|
|||||||
|
ALTER TABLE `blade_waybill`
|
||||||
|
ADD COLUMN `captain_name` varchar(20) DEFAULT NULL COMMENT '船长' AFTER `vehicle_no`,
|
||||||
|
ADD COLUMN `cabin_no` varchar(30) DEFAULT NULL COMMENT '舱位' AFTER `captain_name`,
|
||||||
|
ADD COLUMN `container_no` varchar(30) DEFAULT NULL COMMENT '箱号' AFTER `cabin_no`;
|
||||||
Reference in New Issue
Block a user