Browse Source

feat:新增订单表信息,新增车辆合格证识别,完善订单提交接口

master
tanzs 1 month ago
parent
commit
70dd651684
28 changed files with 654 additions and 124 deletions
  1. +18
    -5
      jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/AutoLogAspect.java
  2. +7
    -7
      jeecg-module-demo/src/main/java/org/jeecg/modules/sysMiniapp/order/controller/AppOrderController.java
  3. +15
    -11
      jeecg-module-demo/src/main/java/org/jeecg/modules/sysMiniapp/order/entity/AppOrder.java
  4. +1
    -1
      jeecg-module-demo/src/main/java/org/jeecg/modules/sysMiniapp/order/entity/AppOrderCar.java
  5. +1
    -1
      jeecg-module-demo/src/main/java/org/jeecg/modules/sysMiniapp/order/entity/AppOrderFinance.java
  6. +10
    -4
      jeecg-module-demo/src/main/java/org/jeecg/modules/sysMiniapp/order/entity/AppOrderVoucher.java
  7. +1
    -1
      jeecg-module-demo/src/main/java/org/jeecg/modules/sysMiniapp/order/mapper/AppOrderCarMapper.java
  8. +1
    -1
      jeecg-module-demo/src/main/java/org/jeecg/modules/sysMiniapp/order/mapper/AppOrderFinanceMapper.java
  9. +1
    -1
      jeecg-module-demo/src/main/java/org/jeecg/modules/sysMiniapp/order/mapper/AppOrderMapper.java
  10. +1
    -1
      jeecg-module-demo/src/main/java/org/jeecg/modules/sysMiniapp/order/mapper/AppOrderVoucherMapper.java
  11. +1
    -1
      jeecg-module-demo/src/main/java/org/jeecg/modules/sysMiniapp/order/service/IAppOrderCarService.java
  12. +1
    -1
      jeecg-module-demo/src/main/java/org/jeecg/modules/sysMiniapp/order/service/IAppOrderFinanceService.java
  13. +1
    -1
      jeecg-module-demo/src/main/java/org/jeecg/modules/sysMiniapp/order/service/IAppOrderService.java
  14. +1
    -1
      jeecg-module-demo/src/main/java/org/jeecg/modules/sysMiniapp/order/service/IAppOrderVoucherService.java
  15. +1
    -1
      jeecg-module-demo/src/main/java/org/jeecg/modules/sysMiniapp/order/service/impl/AppOrderCarServiceImpl.java
  16. +1
    -1
      jeecg-module-demo/src/main/java/org/jeecg/modules/sysMiniapp/order/service/impl/AppOrderFinanceServiceImpl.java
  17. +2
    -2
      jeecg-module-demo/src/main/java/org/jeecg/modules/sysMiniapp/order/service/impl/AppOrderServiceImpl.java
  18. +1
    -1
      jeecg-module-demo/src/main/java/org/jeecg/modules/sysMiniapp/order/service/impl/AppOrderVoucherServiceImpl.java
  19. +15
    -11
      jeecg-module-demo/src/main/java/org/jeecg/modules/sysMiniapp/order/vo/AppOrderPage.java
  20. +84
    -56
      jeecg-module-demo/src/main/java/org/jeecg/modules/sysMiniapp/order/vue3/AppOrder.data.ts
  21. +5
    -0
      jeecg-module-demo/src/main/java/org/jeecg/modules/sysMiniapp/order/vue3/AppOrderList.vue
  22. +7
    -7
      jeecg-module-demo/src/main/java/org/jeecg/modules/sysMiniapp/order/vue3/V20250222_1__menu_insert_AppOrder.sql
  23. +30
    -2
      jeecg-module-miniapp/src/main/java/org/jeecg/modules/miniapp/order/controller/OrderController.java
  24. +158
    -0
      jeecg-module-miniapp/src/main/java/org/jeecg/modules/miniapp/order/entity/OrderInfo.java
  25. +31
    -0
      jeecg-module-miniapp/src/main/java/org/jeecg/modules/miniapp/order/service/OrderService.java
  26. +142
    -0
      jeecg-module-miniapp/src/main/java/org/jeecg/modules/miniapp/order/service/impl/OrderServiceImpl.java
  27. +86
    -6
      jeecg-module-miniapp/src/main/java/org/jeecg/modules/miniapp/utils/PdfFormUtils.java
  28. +31
    -0
      jeecg-module-miniapp/src/main/java/org/jeecg/modules/miniapp/utils/UserInfoUtil.java

+ 18
- 5
jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/AutoLogAspect.java View File

@ -15,6 +15,7 @@ import org.jeecg.common.aspect.annotation.AutoLog;
import org.jeecg.common.constant.CommonConstant;
import org.jeecg.common.constant.enums.ModuleType;
import org.jeecg.common.constant.enums.OperateTypeEnum;
import org.jeecg.common.system.vo.MLoginUser;
import org.jeecg.modules.base.service.BaseCommonService;
import org.jeecg.common.system.vo.LoginUser;
import org.jeecg.common.util.IpUtils;
@ -31,6 +32,8 @@ import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
import java.util.Date;
import static org.jeecg.common.system.util.JwtUtil.getUserChannelByToken;
/**
* 系统日志切面处理类
@ -100,11 +103,21 @@ public class AutoLogAspect {
//设置IP地址
dto.setIp(IpUtils.getIpAddr(request));
//获取登录用户信息
LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
if(sysUser!=null){
dto.setUserid(sysUser.getUsername());
dto.setUsername(sysUser.getRealname());
String channel = getUserChannelByToken(SpringContextUtils.getHttpServletRequest());
if (channel != null && channel.equals("miniapp")) {
//获取登录用户信息
MLoginUser sysUser = (MLoginUser) SecurityUtils.getSubject().getPrincipal();
if(sysUser!=null){
dto.setUserid(sysUser.getNickName());
dto.setUsername(sysUser.getNickName());
}
}else {
//获取登录用户信息
LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
if(sysUser!=null){
dto.setUserid(sysUser.getUsername());
dto.setUsername(sysUser.getRealname());
}
}
//耗时
dto.setCostTime(time);


+ 7
- 7
jeecg-module-demo/src/main/java/org/jeecg/modules/sysMiniapp/order/controller/AppOrderController.java View File

@ -14,9 +14,6 @@ import org.jeecg.modules.sysMiniapp.order.entity.AppOrder;
import org.jeecg.modules.sysMiniapp.order.entity.AppOrderCar;
import org.jeecg.modules.sysMiniapp.order.entity.AppOrderFinance;
import org.jeecg.modules.sysMiniapp.order.entity.AppOrderVoucher;
import org.jeecg.modules.sysMiniapp.order.service.IAppOrderCarService;
import org.jeecg.modules.sysMiniapp.order.service.IAppOrderFinanceService;
import org.jeecg.modules.sysMiniapp.order.service.IAppOrderVoucherService;
import org.jeecg.modules.sysMiniapp.order.vo.AppOrderPage;
import org.jeecgframework.poi.excel.ExcelImportUtil;
import org.jeecgframework.poi.excel.def.NormalExcelConstants;
@ -30,6 +27,9 @@ import org.jeecg.common.system.query.QueryGenerator;
import org.jeecg.common.system.query.QueryRuleEnum;
import org.jeecg.common.util.oConvertUtils;
import org.jeecg.modules.sysMiniapp.order.service.IAppOrderService;
import org.jeecg.modules.sysMiniapp.order.service.IAppOrderCarService;
import org.jeecg.modules.sysMiniapp.order.service.IAppOrderVoucherService;
import org.jeecg.modules.sysMiniapp.order.service.IAppOrderFinanceService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@ -49,7 +49,7 @@ import org.apache.shiro.authz.annotation.RequiresPermissions;
/**
* @Description: 合同订单表
* @Author: jeecg-boot
* @Date: 2025-02-21
* @Date: 2025-02-22
* @Version: V1.0
*/
@Api(tags="合同订单表")
@ -79,9 +79,9 @@ public class AppOrderController {
@ApiOperation(value="合同订单表-分页列表查询", notes="合同订单表-分页列表查询")
@GetMapping(value = "/list")
public Result<IPage<AppOrder>> queryPageList(AppOrder appOrder,
@RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
@RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
HttpServletRequest req) {
@RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
@RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
HttpServletRequest req) {
// 自定义查询规则
Map<String, QueryRuleEnum> customeRuleMap = new HashMap<>();
// 自定义多选的查询规则为LIKE_WITH_OR


+ 15
- 11
jeecg-module-demo/src/main/java/org/jeecg/modules/sysMiniapp/order/entity/AppOrder.java View File

@ -20,7 +20,7 @@ import io.swagger.annotations.ApiModelProperty;
/**
* @Description: 合同订单表
* @Author: jeecg-boot
* @Date: 2025-02-21
* @Date: 2025-02-22
* @Version: V1.0
*/
@ApiModel(value="app_order对象", description="合同订单表")
@ -33,18 +33,26 @@ public class AppOrder implements Serializable {
@TableId(type = IdType.ASSIGN_ID)
@ApiModelProperty(value = "主键")
private java.lang.String id;
/**订单编号*/
@Excel(name = "订单编号", width = 15)
@ApiModelProperty(value = "订单编号")
private java.lang.String orderNum;
/**产品服务名称*/
@Excel(name = "产品服务名称", width = 15)
@ApiModelProperty(value = "产品服务名称")
private java.lang.String productName;
/**服务年限*/
@Excel(name = "服务年限", width = 15)
@ApiModelProperty(value = "服务年限")
/**产品服务年限*/
@Excel(name = "产品服务年限", width = 15)
@ApiModelProperty(value = "产品服务年限")
private java.lang.String productServiceYear;
/**销售金额*/
@Excel(name = "销售金额", width = 15)
@ApiModelProperty(value = "销售金额")
/**产品销售金额*/
@Excel(name = "产品销售金额", width = 15)
@ApiModelProperty(value = "产品销售金额")
private java.math.BigDecimal productMoney;
/**产品合同模板*/
@Excel(name = "产品合同模板", width = 15)
@ApiModelProperty(value = "产品合同模板")
private java.lang.String productContractTemp;
/**经销商*/
@Excel(name = "经销商", width = 15)
@ApiModelProperty(value = "经销商")
@ -141,8 +149,4 @@ public class AppOrder implements Serializable {
@Excel(name = "支付凭证", width = 15)
@ApiModelProperty(value = "支付凭证")
private java.lang.String payVoucherUrl;
/**订单编号*/
@Excel(name = "订单编号", width = 15)
@ApiModelProperty(value = "订单编号")
private java.lang.String orderNum;
}

+ 1
- 1
jeecg-module-demo/src/main/java/org/jeecg/modules/sysMiniapp/order/entity/AppOrderCar.java View File

@ -19,7 +19,7 @@ import java.io.UnsupportedEncodingException;
/**
* @Description: 订单车辆信息
* @Author: jeecg-boot
* @Date: 2025-02-21
* @Date: 2025-02-22
* @Version: V1.0
*/
@ApiModel(value="app_order_car对象", description="订单车辆信息")


+ 1
- 1
jeecg-module-demo/src/main/java/org/jeecg/modules/sysMiniapp/order/entity/AppOrderFinance.java View File

@ -19,7 +19,7 @@ import java.io.UnsupportedEncodingException;
/**
* @Description: 订单金融信息
* @Author: jeecg-boot
* @Date: 2025-02-21
* @Date: 2025-02-22
* @Version: V1.0
*/
@ApiModel(value="app_order_finance对象", description="订单金融信息")


+ 10
- 4
jeecg-module-demo/src/main/java/org/jeecg/modules/sysMiniapp/order/entity/AppOrderVoucher.java View File

@ -19,7 +19,7 @@ import java.io.UnsupportedEncodingException;
/**
* @Description: 订单凭证信息
* @Author: jeecg-boot
* @Date: 2025-02-21
* @Date: 2025-02-22
* @Version: V1.0
*/
@ApiModel(value="app_order_voucher对象", description="订单凭证信息")
@ -60,11 +60,17 @@ public class AppOrderVoucher implements Serializable {
@ApiModelProperty(value = "服务费")
private java.math.BigDecimal serviceMoney;
/**生效时间*/
@Excel(name = "生效时间", width = 20, format = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
@Excel(name = "生效时间", width = 15, format = "yyyy-MM-dd")
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
@DateTimeFormat(pattern="yyyy-MM-dd")
@ApiModelProperty(value = "生效时间")
private java.util.Date effectiveTime;
/**失效时间*/
@Excel(name = "失效时间", width = 15, format = "yyyy-MM-dd")
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
@DateTimeFormat(pattern="yyyy-MM-dd")
@ApiModelProperty(value = "失效时间")
private java.util.Date endTime;
/**服务年限*/
@Excel(name = "服务年限", width = 15)
@ApiModelProperty(value = "服务年限")


+ 1
- 1
jeecg-module-demo/src/main/java/org/jeecg/modules/sysMiniapp/order/mapper/AppOrderCarMapper.java View File

@ -8,7 +8,7 @@ import org.apache.ibatis.annotations.Param;
/**
* @Description: 订单车辆信息
* @Author: jeecg-boot
* @Date: 2025-02-21
* @Date: 2025-02-22
* @Version: V1.0
*/
public interface AppOrderCarMapper extends BaseMapper<AppOrderCar> {


+ 1
- 1
jeecg-module-demo/src/main/java/org/jeecg/modules/sysMiniapp/order/mapper/AppOrderFinanceMapper.java View File

@ -8,7 +8,7 @@ import org.apache.ibatis.annotations.Param;
/**
* @Description: 订单金融信息
* @Author: jeecg-boot
* @Date: 2025-02-21
* @Date: 2025-02-22
* @Version: V1.0
*/
public interface AppOrderFinanceMapper extends BaseMapper<AppOrderFinance> {


+ 1
- 1
jeecg-module-demo/src/main/java/org/jeecg/modules/sysMiniapp/order/mapper/AppOrderMapper.java View File

@ -6,7 +6,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @Description: 合同订单表
* @Author: jeecg-boot
* @Date: 2025-02-21
* @Date: 2025-02-22
* @Version: V1.0
*/
public interface AppOrderMapper extends BaseMapper<AppOrder> {


+ 1
- 1
jeecg-module-demo/src/main/java/org/jeecg/modules/sysMiniapp/order/mapper/AppOrderVoucherMapper.java View File

@ -8,7 +8,7 @@ import org.apache.ibatis.annotations.Param;
/**
* @Description: 订单凭证信息
* @Author: jeecg-boot
* @Date: 2025-02-21
* @Date: 2025-02-22
* @Version: V1.0
*/
public interface AppOrderVoucherMapper extends BaseMapper<AppOrderVoucher> {


+ 1
- 1
jeecg-module-demo/src/main/java/org/jeecg/modules/sysMiniapp/order/service/IAppOrderCarService.java View File

@ -8,7 +8,7 @@ import java.util.List;
/**
* @Description: 订单车辆信息
* @Author: jeecg-boot
* @Date: 2025-02-21
* @Date: 2025-02-22
* @Version: V1.0
*/
public interface IAppOrderCarService extends IService<AppOrderCar> {


+ 1
- 1
jeecg-module-demo/src/main/java/org/jeecg/modules/sysMiniapp/order/service/IAppOrderFinanceService.java View File

@ -8,7 +8,7 @@ import java.util.List;
/**
* @Description: 订单金融信息
* @Author: jeecg-boot
* @Date: 2025-02-21
* @Date: 2025-02-22
* @Version: V1.0
*/
public interface IAppOrderFinanceService extends IService<AppOrderFinance> {


+ 1
- 1
jeecg-module-demo/src/main/java/org/jeecg/modules/sysMiniapp/order/service/IAppOrderService.java View File

@ -13,7 +13,7 @@ import java.util.List;
/**
* @Description: 合同订单表
* @Author: jeecg-boot
* @Date: 2025-02-21
* @Date: 2025-02-22
* @Version: V1.0
*/
public interface IAppOrderService extends IService<AppOrder> {


+ 1
- 1
jeecg-module-demo/src/main/java/org/jeecg/modules/sysMiniapp/order/service/IAppOrderVoucherService.java View File

@ -8,7 +8,7 @@ import java.util.List;
/**
* @Description: 订单凭证信息
* @Author: jeecg-boot
* @Date: 2025-02-21
* @Date: 2025-02-22
* @Version: V1.0
*/
public interface IAppOrderVoucherService extends IService<AppOrderVoucher> {


+ 1
- 1
jeecg-module-demo/src/main/java/org/jeecg/modules/sysMiniapp/order/service/impl/AppOrderCarServiceImpl.java View File

@ -11,7 +11,7 @@ import org.springframework.beans.factory.annotation.Autowired;
/**
* @Description: 订单车辆信息
* @Author: jeecg-boot
* @Date: 2025-02-21
* @Date: 2025-02-22
* @Version: V1.0
*/
@Service


+ 1
- 1
jeecg-module-demo/src/main/java/org/jeecg/modules/sysMiniapp/order/service/impl/AppOrderFinanceServiceImpl.java View File

@ -11,7 +11,7 @@ import org.springframework.beans.factory.annotation.Autowired;
/**
* @Description: 订单金融信息
* @Author: jeecg-boot
* @Date: 2025-02-21
* @Date: 2025-02-22
* @Version: V1.0
*/
@Service


+ 2
- 2
jeecg-module-demo/src/main/java/org/jeecg/modules/sysMiniapp/order/service/impl/AppOrderServiceImpl.java View File

@ -20,7 +20,7 @@ import java.util.Collection;
/**
* @Description: 合同订单表
* @Author: jeecg-boot
* @Date: 2025-02-21
* @Date: 2025-02-22
* @Version: V1.0
*/
@Service
@ -37,7 +37,7 @@ public class AppOrderServiceImpl extends ServiceImpl<AppOrderMapper, AppOrder> i
@Override
@Transactional(rollbackFor = Exception.class)
public void saveMain(AppOrder appOrder, List<AppOrderCar> appOrderCarList, List<AppOrderVoucher> appOrderVoucherList, List<AppOrderFinance> appOrderFinanceList) {
public void saveMain(AppOrder appOrder, List<AppOrderCar> appOrderCarList,List<AppOrderVoucher> appOrderVoucherList,List<AppOrderFinance> appOrderFinanceList) {
appOrderMapper.insert(appOrder);
if(appOrderCarList!=null && appOrderCarList.size()>0) {
for(AppOrderCar entity:appOrderCarList) {


+ 1
- 1
jeecg-module-demo/src/main/java/org/jeecg/modules/sysMiniapp/order/service/impl/AppOrderVoucherServiceImpl.java View File

@ -11,7 +11,7 @@ import org.springframework.beans.factory.annotation.Autowired;
/**
* @Description: 订单凭证信息
* @Author: jeecg-boot
* @Date: 2025-02-21
* @Date: 2025-02-22
* @Version: V1.0
*/
@Service


+ 15
- 11
jeecg-module-demo/src/main/java/org/jeecg/modules/sysMiniapp/order/vo/AppOrderPage.java View File

@ -17,7 +17,7 @@ import io.swagger.annotations.ApiModelProperty;
/**
* @Description: 合同订单表
* @Author: jeecg-boot
* @Date: 2025-02-21
* @Date: 2025-02-22
* @Version: V1.0
*/
@Data
@ -27,18 +27,26 @@ public class AppOrderPage {
/**主键*/
@ApiModelProperty(value = "主键")
private java.lang.String id;
/**订单编号*/
@Excel(name = "订单编号", width = 15)
@ApiModelProperty(value = "订单编号")
private java.lang.String orderNum;
/**产品服务名称*/
@Excel(name = "产品服务名称", width = 15)
@ApiModelProperty(value = "产品服务名称")
private java.lang.String productName;
/**服务年限*/
@Excel(name = "服务年限", width = 15)
@ApiModelProperty(value = "服务年限")
/**产品服务年限*/
@Excel(name = "产品服务年限", width = 15)
@ApiModelProperty(value = "产品服务年限")
private java.lang.String productServiceYear;
/**销售金额*/
@Excel(name = "销售金额", width = 15)
@ApiModelProperty(value = "销售金额")
/**产品销售金额*/
@Excel(name = "产品销售金额", width = 15)
@ApiModelProperty(value = "产品销售金额")
private java.math.BigDecimal productMoney;
/**产品合同模板*/
@Excel(name = "产品合同模板", width = 15)
@ApiModelProperty(value = "产品合同模板")
private java.lang.String productContractTemp;
/**经销商*/
@Excel(name = "经销商", width = 15)
@ApiModelProperty(value = "经销商")
@ -135,10 +143,6 @@ public class AppOrderPage {
@Excel(name = "支付凭证", width = 15)
@ApiModelProperty(value = "支付凭证")
private java.lang.String payVoucherUrl;
/**订单编号*/
@Excel(name = "订单编号", width = 15)
@ApiModelProperty(value = "订单编号")
private java.lang.String orderNum;
@ExcelCollection(name="订单车辆信息")
@ApiModelProperty(value = "订单车辆信息")


+ 84
- 56
jeecg-module-demo/src/main/java/org/jeecg/modules/sysMiniapp/order/vue3/AppOrder.data.ts View File

@ -6,21 +6,31 @@ import {JVxeTypes,JVxeColumn} from '/@/components/jeecg/JVxeTable/types'
import { getWeekMonthQuarterYear } from '/@/utils';
//列表数据
export const columns: BasicColumn[] = [
{
title: '订单编号',
align:"center",
dataIndex: 'orderNum'
},
{
title: '产品服务名称',
align:"center",
dataIndex: 'productName'
},
{
title: '服务年限',
title: '产品服务年限',
align:"center",
dataIndex: 'productServiceYear'
},
{
title: '销售金额',
title: '产品销售金额',
align:"center",
dataIndex: 'productMoney'
},
{
title: '产品合同模板',
align:"center",
dataIndex: 'productContractTemp',
},
{
title: '经销商',
align:"center",
@ -121,14 +131,15 @@ export const columns: BasicColumn[] = [
dataIndex: 'payVoucherUrl',
customRender:render.renderImage,
},
{
title: '订单编号',
align:"center",
dataIndex: 'orderNum'
},
];
//查询数据
export const searchFormSchema: FormSchema[] = [
{
label: "订单编号",
field: "orderNum",
component: 'Input',
//colProps: {span: 6},
},
{
label: "产品服务名称",
field: "productName",
@ -199,12 +210,6 @@ export const searchFormSchema: FormSchema[] = [
},
//colProps: {span: 6},
},
{
label: "订单编号",
field: "orderNum",
component: 'Input',
//colProps: {span: 6},
},
];
//表单数据
export const formSchema: FormSchema[] = [
@ -219,22 +224,34 @@ export const formSchema: FormSchema[] = [
},
},
{
label: '服务年限',
label: '产品服务年限',
field: 'productServiceYear',
component: 'Input',
dynamicRules: ({model,schema}) => {
return [
{ required: true, message: '请输入服务年限!'},
{ required: true, message: '请输入产品服务年限!'},
];
},
},
{
label: '销售金额',
label: '产品销售金额',
field: 'productMoney',
component: 'InputNumber',
dynamicRules: ({model,schema}) => {
return [
{ required: true, message: '请输入销售金额!'},
{ required: true, message: '请输入产品销售金额!'},
];
},
},
{
label: '产品合同模板',
field: 'productContractTemp',
component: 'JUpload',
componentProps:{
},
dynamicRules: ({model,schema}) => {
return [
{ required: true, message: '请输入产品合同模板!'},
];
},
},
@ -369,9 +386,11 @@ export const formSchema: FormSchema[] = [
{
label: '订单状态',
field: 'status',
defaultValue: 0,
component: 'JDictSelectTag',
componentProps:{
dictCode:"order_status"
dictCode:"order_status",
type: "radio"
},
dynamicRules: ({model,schema}) => {
return [
@ -583,15 +602,22 @@ export const appOrderVoucherFormSchema: FormSchema[] = [
field: 'effectiveTime',
component: 'DatePicker',
componentProps: {
showTime:true,
valueFormat: 'YYYY-MM-DD HH:mm:ss'
},
valueFormat: 'YYYY-MM-DD'
},
dynamicRules: ({model,schema}) => {
return [
{ required: true, message: '请输入生效时间!'},
];
},
},
{
label: '失效时间',
field: 'endTime',
component: 'DatePicker',
componentProps: {
valueFormat: 'YYYY-MM-DD'
},
},
{
label: '服务年限',
field: 'serviceYear',
@ -700,29 +726,30 @@ export const appOrderFinanceFormSchema: FormSchema[] = [
// 高级查询数据
export const superQuerySchema = {
productName: {title: '产品服务名称',order: 0,view: 'text', type: 'string',},
productServiceYear: {title: '服务年限',order: 1,view: 'text', type: 'string',},
productMoney: {title: '销售金额',order: 2,view: 'number', type: 'number',},
storeName: {title: '经销商',order: 3,view: 'text', type: 'string',},
custName: {title: '客户姓名',order: 4,view: 'text', type: 'string',},
custAddress: {title: '客户地址',order: 5,view: 'text', type: 'string',},
custCardNo: {title: '客户证件号',order: 6,view: 'text', type: 'string',},
custPhone: {title: '客户联系电话',order: 7,view: 'text', type: 'string',},
salePort: {title: '销售端口',order: 8,view: 'list', type: 'string',dictCode: 'order_sale_port',},
saleName: {title: '销售顾问',order: 9,view: 'text', type: 'string',},
payType: {title: '付款方式',order: 10,view: 'text', type: 'string',},
custType: {title: '客户类型',order: 11,view: 'number', type: 'number',dictCode: 'customer_type',},
certFront: {title: '身份证正面照',order: 12,view: 'image', type: 'string',},
certBack: {title: '身份证反面照',order: 13,view: 'image', type: 'string',},
carPic: {title: '车辆合格证',order: 14,view: 'image', type: 'string',},
busLicense: {title: '营业执照',order: 15,view: 'image', type: 'string',},
createTime: {title: '创建日期',order: 16,view: 'datetime', type: 'string',},
status: {title: '订单状态',order: 17,view: 'number', type: 'number',dictCode: 'order_status',},
contractUrl: {title: '订单合同',order: 18,view: 'file', type: 'string',},
payee: {title: '收款方',order: 19,view: 'text', type: 'string',},
payeeTime: {title: '收款时间',order: 20,view: 'datetime', type: 'string',},
payVoucherUrl: {title: '支付凭证',order: 21,view: 'image', type: 'string',},
orderNum: {title: '订单编号',order: 22,view: 'text', type: 'string',},
orderNum: {title: '订单编号',order: 0,view: 'text', type: 'string',},
productName: {title: '产品服务名称',order: 1,view: 'text', type: 'string',},
productServiceYear: {title: '产品服务年限',order: 2,view: 'text', type: 'string',},
productMoney: {title: '产品销售金额',order: 3,view: 'number', type: 'number',},
productContractTemp: {title: '产品合同模板',order: 4,view: 'file', type: 'string',},
storeName: {title: '经销商',order: 5,view: 'text', type: 'string',},
custName: {title: '客户姓名',order: 6,view: 'text', type: 'string',},
custAddress: {title: '客户地址',order: 7,view: 'text', type: 'string',},
custCardNo: {title: '客户证件号',order: 8,view: 'text', type: 'string',},
custPhone: {title: '客户联系电话',order: 9,view: 'text', type: 'string',},
salePort: {title: '销售端口',order: 10,view: 'list', type: 'string',dictCode: 'order_sale_port',},
saleName: {title: '销售顾问',order: 11,view: 'text', type: 'string',},
payType: {title: '付款方式',order: 12,view: 'text', type: 'string',},
custType: {title: '客户类型',order: 13,view: 'number', type: 'number',dictCode: 'customer_type',},
certFront: {title: '身份证正面照',order: 14,view: 'image', type: 'string',},
certBack: {title: '身份证反面照',order: 15,view: 'image', type: 'string',},
carPic: {title: '车辆合格证',order: 16,view: 'image', type: 'string',},
busLicense: {title: '营业执照',order: 17,view: 'image', type: 'string',},
createTime: {title: '创建日期',order: 18,view: 'datetime', type: 'string',},
status: {title: '订单状态',order: 19,view: 'number', type: 'number',dictCode: 'order_status',},
contractUrl: {title: '订单合同',order: 20,view: 'file', type: 'string',},
payee: {title: '收款方',order: 21,view: 'text', type: 'string',},
payeeTime: {title: '收款时间',order: 22,view: 'datetime', type: 'string',},
payVoucherUrl: {title: '支付凭证',order: 23,view: 'image', type: 'string',},
//子表高级查询
appOrderCar: {
title: '订单车辆信息',
@ -749,18 +776,19 @@ export const superQuerySchema = {
fields: {
firstBeneficiary: {title: '第一受益人',order: 0,view: 'text', type: 'string',},
serviceMoney: {title: '服务费',order: 1,view: 'number', type: 'number',},
effectiveTime: {title: '生效时间',order: 2,view: 'datetime', type: 'string',},
serviceYear: {title: '服务年限',order: 3,view: 'text', type: 'string',},
equityPackage: {title: '权益套餐',order: 4,view: 'text', type: 'string',},
packageMoney: {title: '套餐价',order: 5,view: 'number', type: 'number',},
carInsuranceNo: {title: '商业险编号',order: 6,view: 'text', type: 'string',},
registeredCity: {title: '上牌城市',order: 7,view: 'text', type: 'string',},
insuranceName: {title: '保险公司',order: 8,view: 'text', type: 'string',},
assigneeName: {title: '受让人名称',order: 9,view: 'text', type: 'string',},
assigneePhone: {title: '受让人电话',order: 10,view: 'text', type: 'string',},
assigneeCardNo: {title: '受让人身份证',order: 11,view: 'text', type: 'string',},
payTime: {title: '支付时间',order: 12,view: 'date', type: 'string',},
dealerAddress: {title: '经销商地址',order: 13,view: 'text', type: 'string',},
effectiveTime: {title: '生效时间',order: 2,view: 'date', type: 'string',},
endTime: {title: '失效时间',order: 3,view: 'date', type: 'string',},
serviceYear: {title: '服务年限',order: 4,view: 'text', type: 'string',},
equityPackage: {title: '权益套餐',order: 5,view: 'text', type: 'string',},
packageMoney: {title: '套餐价',order: 6,view: 'number', type: 'number',},
carInsuranceNo: {title: '商业险编号',order: 7,view: 'text', type: 'string',},
registeredCity: {title: '上牌城市',order: 8,view: 'text', type: 'string',},
insuranceName: {title: '保险公司',order: 9,view: 'text', type: 'string',},
assigneeName: {title: '受让人名称',order: 10,view: 'text', type: 'string',},
assigneePhone: {title: '受让人电话',order: 11,view: 'text', type: 'string',},
assigneeCardNo: {title: '受让人身份证',order: 12,view: 'text', type: 'string',},
payTime: {title: '支付时间',order: 13,view: 'date', type: 'string',},
dealerAddress: {title: '经销商地址',order: 14,view: 'text', type: 'string',},
}
},
appOrderFinance: {


+ 5
- 0
jeecg-module-demo/src/main/java/org/jeecg/modules/sysMiniapp/order/vue3/AppOrderList.vue View File

@ -29,6 +29,11 @@
</template>
<!--字段回显插槽-->
<template v-slot:bodyCell="{ column, record, index, text }">
<template v-if="column.dataIndex==='productContractTemp'">
<!--文件字段回显插槽-->
<span v-if="!text" style="font-size: 12px;font-style: italic;">无文件</span>
<a-button v-else :ghost="true" type="primary" preIcon="ant-design:download-outlined" size="small" @click="downloadFile(text)">下载</a-button>
</template>
<template v-if="column.dataIndex==='contractUrl'">
<!--文件字段回显插槽-->
<span v-if="!text" style="font-size: 12px;font-style: italic;">无文件</span>


jeecg-module-demo/src/main/java/org/jeecg/modules/sysMiniapp/order/vue3/V20250221_1__menu_insert_AppOrder.sql → jeecg-module-demo/src/main/java/org/jeecg/modules/sysMiniapp/order/vue3/V20250222_1__menu_insert_AppOrder.sql View File

@ -3,24 +3,24 @@
INSERT INTO sys_permission(id, parent_id, name, url, component, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_route, is_leaf, keep_alive, hidden, hide_tab, description, status, del_flag, rule_flag, create_by, create_time, update_by, update_time, internal_or_external)
VALUES ('2025022105354000190', NULL, '合同订单表', '/order/appOrderList', 'order/AppOrderList', NULL, NULL, 0, NULL, '1', 0.00, 0, NULL, 1, 0, 0, 0, 0, NULL, '1', 0, 0, 'admin', '2025-02-21 17:35:19', NULL, NULL, 0);
VALUES ('2025022208393220380', NULL, '合同订单表', '/order/appOrderList', 'order/AppOrderList', NULL, NULL, 0, NULL, '1', 0.00, 0, NULL, 1, 0, 0, 0, 0, NULL, '1', 0, 0, 'admin', '2025-02-22 20:39:38', NULL, NULL, 0);
-- 权限控制sql
-- 新增
INSERT INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external)
VALUES ('2025022105354000191', '2025022105354000190', '添加合同订单表', NULL, NULL, 0, NULL, NULL, 2, 'order:app_order:add', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-02-21 17:35:19', NULL, NULL, 0, 0, '1', 0);
VALUES ('2025022208393220381', '2025022208393220380', '添加合同订单表', NULL, NULL, 0, NULL, NULL, 2, 'order:app_order:add', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-02-22 20:39:38', NULL, NULL, 0, 0, '1', 0);
-- 编辑
INSERT INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external)
VALUES ('2025022105354000192', '2025022105354000190', '编辑合同订单表', NULL, NULL, 0, NULL, NULL, 2, 'order:app_order:edit', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-02-21 17:35:19', NULL, NULL, 0, 0, '1', 0);
VALUES ('2025022208393220382', '2025022208393220380', '编辑合同订单表', NULL, NULL, 0, NULL, NULL, 2, 'order:app_order:edit', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-02-22 20:39:38', NULL, NULL, 0, 0, '1', 0);
-- 删除
INSERT INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external)
VALUES ('2025022105354000193', '2025022105354000190', '删除合同订单表', NULL, NULL, 0, NULL, NULL, 2, 'order:app_order:delete', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-02-21 17:35:19', NULL, NULL, 0, 0, '1', 0);
VALUES ('2025022208393220383', '2025022208393220380', '删除合同订单表', NULL, NULL, 0, NULL, NULL, 2, 'order:app_order:delete', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-02-22 20:39:38', NULL, NULL, 0, 0, '1', 0);
-- 批量删除
INSERT INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external)
VALUES ('2025022105354000194', '2025022105354000190', '批量删除合同订单表', NULL, NULL, 0, NULL, NULL, 2, 'order:app_order:deleteBatch', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-02-21 17:35:19', NULL, NULL, 0, 0, '1', 0);
VALUES ('2025022208393220384', '2025022208393220380', '批量删除合同订单表', NULL, NULL, 0, NULL, NULL, 2, 'order:app_order:deleteBatch', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-02-22 20:39:38', NULL, NULL, 0, 0, '1', 0);
-- 导出excel
INSERT INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external)
VALUES ('2025022105354000195', '2025022105354000190', '导出excel_合同订单表', NULL, NULL, 0, NULL, NULL, 2, 'order:app_order:exportXls', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-02-21 17:35:19', NULL, NULL, 0, 0, '1', 0);
VALUES ('2025022208393220385', '2025022208393220380', '导出excel_合同订单表', NULL, NULL, 0, NULL, NULL, 2, 'order:app_order:exportXls', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-02-22 20:39:38', NULL, NULL, 0, 0, '1', 0);
-- 导入excel
INSERT INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external)
VALUES ('2025022105354000196', '2025022105354000190', '导入excel_合同订单表', NULL, NULL, 0, NULL, NULL, 2, 'order:app_order:importExcel', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-02-21 17:35:19', NULL, NULL, 0, 0, '1', 0);
VALUES ('2025022208393220386', '2025022208393220380', '导入excel_合同订单表', NULL, NULL, 0, NULL, NULL, 2, 'order:app_order:importExcel', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-02-22 20:39:38', NULL, NULL, 0, 0, '1', 0);

+ 30
- 2
jeecg-module-miniapp/src/main/java/org/jeecg/modules/miniapp/order/controller/OrderController.java View File

@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.SecurityUtils;
@ -14,6 +16,8 @@ import org.jeecg.common.system.query.QueryGenerator;
import org.jeecg.common.system.query.QueryRuleEnum;
import org.jeecg.common.system.vo.LoginUser;
import org.jeecg.common.util.oConvertUtils;
import org.jeecg.modules.miniapp.order.service.OrderService;
import org.jeecg.modules.miniapp.order.service.impl.OrderServiceImpl;
import org.jeecg.modules.sysMiniapp.order.entity.AppOrder;
import org.jeecg.modules.sysMiniapp.order.entity.AppOrderCar;
import org.jeecg.modules.sysMiniapp.order.entity.AppOrderFinance;
@ -60,6 +64,8 @@ public class OrderController {
private IAppOrderVoucherService appOrderVoucherService;
@Autowired
private IAppOrderFinanceService appOrderFinanceService;
@Autowired
private OrderService orderService;
/**
* 分页列表查询
@ -101,10 +107,31 @@ public class OrderController {
public Result<String> add(@RequestBody AppOrderPage appOrderPage) {
AppOrder appOrder = new AppOrder();
BeanUtils.copyProperties(appOrderPage, appOrder);
appOrderService.saveMain(appOrder, appOrderPage.getAppOrderCarList(),appOrderPage.getAppOrderVoucherList(),appOrderPage.getAppOrderFinanceList());
orderService.saveOrder(appOrder, appOrderPage.getAppOrderCarList(),appOrderPage.getAppOrderVoucherList(),appOrderPage.getAppOrderFinanceList());
return Result.OK("添加成功!");
}
/**
* 生成合同
* @param orderId 订单 id
* @return
*/
@AutoLog(value = "合同订单表-生成合同")
@ApiOperation(value="合同订单表-生成合同", notes="合同订单表-生成合同")
@GetMapping(value = "/addContract")
@ApiImplicitParams({
@ApiImplicitParam(name = "orderId", value = "订单id", required = true, dataType = "String", paramType = "query"),
})
public Result<String> addContract(@RequestParam(value = "orderId")String orderId) {
AppOrder appOrderEntity = appOrderService.getById(orderId);
if(appOrderEntity==null) {
return Result.error("未找到对应数据");
}
String url = orderService.addOrderContract(appOrderEntity);
return Result.OK(url);
}
/**
* 编辑
*
@ -113,7 +140,6 @@ public class OrderController {
*/
@AutoLog(value = "合同订单表-编辑")
@ApiOperation(value="合同订单表-编辑", notes="合同订单表-编辑")
@RequiresPermissions("order:app_order:edit")
@RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
public Result<String> edit(@RequestBody AppOrderPage appOrderPage) {
AppOrder appOrder = new AppOrder();
@ -126,6 +152,7 @@ public class OrderController {
return Result.OK("编辑成功!");
}
/**
* 通过id查询
*
@ -185,4 +212,5 @@ public class OrderController {
}
}

+ 158
- 0
jeecg-module-miniapp/src/main/java/org/jeecg/modules/miniapp/order/entity/OrderInfo.java View File

@ -0,0 +1,158 @@
package org.jeecg.modules.miniapp.order.entity;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.jeecg.common.aspect.annotation.Dict;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
/**
* @author tanzs
* @date 2025/2/22 18:01
* 订单组合信息
*/
@Data
public class OrderInfo implements Serializable {
private static final long serialVersionUID = 1L;
/**主键*/
private java.lang.String id;
/**订单编号*/
private java.lang.String orderNum;
/**产品服务名称*/
private java.lang.String productName;
/**产品服务年限*/
private java.lang.String productServiceYear;
/**产品销售金额*/
private java.math.BigDecimal productMoney;
/**产品合同模板*/
private java.lang.String productContractTemp;
/**经销商*/
private java.lang.String storeName;
/**客户姓名*/
private java.lang.String custName;
/**客户地址*/
private java.lang.String custAddress;
/**客户证件号*/
private java.lang.String custCardNo;
/**客户联系电话*/
private java.lang.String custPhone;
/**销售端口*/
@Dict(dicCode = "order_sale_port")
private java.lang.String salePort;
/**创建人*/
private java.lang.String createBy;
/**销售顾问*/
private java.lang.String saleName;
/**付款方式*/
private java.lang.String payType;
/**客户类型*/
@Dict(dicCode = "customer_type")
private java.lang.Integer custType;
/**身份证正面照*/
private java.lang.String certFront;
/**身份证反面照*/
private java.lang.String certBack;
/**车辆合格证*/
private java.lang.String carPic;
/**营业执照*/
private java.lang.String busLicense;
/**创建日期*/
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private java.util.Date createTime;
/**订单状态*/
@Dict(dicCode = "order_status")
private java.lang.Integer status;
/**订单合同*/
private java.lang.String contractUrl;
/**收款方*/
private java.lang.String payee;
/**收款时间*/
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private java.util.Date payeeTime;
/**支付凭证*/
private java.lang.String payVoucherUrl;
/** 车辆信息 */
/** 车牌车系 */
private java.lang.String carSeries;
/**车架号*/
private java.lang.String vin;
/**车辆类型*/
private java.lang.String carType;
/**使用性质*/
private java.lang.String useType;
/**是否新车*/
private java.lang.Integer newCar;
/**车辆型号*/
private java.lang.String carModel;
/**车牌号*/
private java.lang.String carNo;
/**发动机号*/
private java.lang.String engineNo;
/**里程*/
private java.lang.String mileage;
/**购车时间*/
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private java.util.Date buyTime;
/**车辆购置价*/
private java.math.BigDecimal buyMoney;
/**车辆购置税*/
private java.math.BigDecimal buyTax;
/** 订单金融信息 */
/**贷款机构*/
private java.lang.String lender;
/**贷款金额*/
private java.math.BigDecimal lenderMoney;
/**贷款年限*/
private java.lang.String lenderYear;
/** 订单凭证信息 */
/**第一受益人*/
private java.lang.String firstBeneficiary;
/**服务费*/
private java.math.BigDecimal serviceMoney;
/**生效时间*/
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private java.util.Date effectiveTime;
/**失效时间*/
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
@DateTimeFormat(pattern="yyyy-MM-dd")
private java.util.Date endTime;
/**服务年限*/
private java.lang.String serviceYear;
/**权益套餐*/
private java.lang.String equityPackage;
/**套餐价*/
private java.math.BigDecimal packageMoney;
/**商业险编号*/
private java.lang.String carInsuranceNo;
/**上牌城市*/
private java.lang.String registeredCity;
/**保险公司*/
private java.lang.String insuranceName;
/**受让人名称*/
private java.lang.String assigneeName;
/**受让人电话*/
private java.lang.String assigneePhone;
/**受让人身份证*/
private java.lang.String assigneeCardNo;
/**支付时间*/
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
@DateTimeFormat(pattern="yyyy-MM-dd")
private java.util.Date payTime;
/**经销商地址*/
private java.lang.String dealerAddress;
}

+ 31
- 0
jeecg-module-miniapp/src/main/java/org/jeecg/modules/miniapp/order/service/OrderService.java View File

@ -0,0 +1,31 @@
package org.jeecg.modules.miniapp.order.service;
import org.jeecg.modules.sysMiniapp.order.entity.AppOrder;
import org.jeecg.modules.sysMiniapp.order.entity.AppOrderCar;
import org.jeecg.modules.sysMiniapp.order.entity.AppOrderFinance;
import org.jeecg.modules.sysMiniapp.order.entity.AppOrderVoucher;
import java.util.List;
/**
* @author tanzs
* @date 2025/2/22 17:28
*/
public interface OrderService {
/**
* 录入订单
* @param appOrder 订单主体
* @param appOrderCarList 订单车辆信息
* @param appOrderVoucherList 订单凭证信息
* @param appOrderFinanceList 订单金额信息
*/
void saveOrder(AppOrder appOrder, List<AppOrderCar> appOrderCarList, List<AppOrderVoucher> appOrderVoucherList, List<AppOrderFinance> appOrderFinanceList);
/**
* 生成订单合同
* @param appOrder
* @return
*/
String addOrderContract(AppOrder appOrder);
}

+ 142
- 0
jeecg-module-miniapp/src/main/java/org/jeecg/modules/miniapp/order/service/impl/OrderServiceImpl.java View File

@ -0,0 +1,142 @@
package org.jeecg.modules.miniapp.order.service.impl;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.Snowflake;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.common.system.vo.MLoginUser;
import org.jeecg.modules.miniapp.order.entity.OrderInfo;
import org.jeecg.modules.miniapp.order.service.OrderService;
import org.jeecg.modules.miniapp.utils.UserInfoUtil;
import org.jeecg.modules.sysMiniapp.order.entity.AppOrder;
import org.jeecg.modules.sysMiniapp.order.entity.AppOrderCar;
import org.jeecg.modules.sysMiniapp.order.entity.AppOrderFinance;
import org.jeecg.modules.sysMiniapp.order.entity.AppOrderVoucher;
import org.jeecg.modules.sysMiniapp.order.mapper.AppOrderCarMapper;
import org.jeecg.modules.sysMiniapp.order.mapper.AppOrderFinanceMapper;
import org.jeecg.modules.sysMiniapp.order.mapper.AppOrderMapper;
import org.jeecg.modules.sysMiniapp.order.mapper.AppOrderVoucherMapper;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.lang.reflect.Field;
import java.text.MessageFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static org.jeecg.modules.miniapp.utils.PdfFormUtils.*;
/**
* @author tanzs
* @date 2025/2/22 17:29
*/
@Service
@Slf4j
public class OrderServiceImpl implements OrderService {
@Autowired
private AppOrderMapper appOrderMapper;
@Autowired
private AppOrderCarMapper appOrderCarMapper;
@Autowired
private AppOrderVoucherMapper appOrderVoucherMapper;
@Autowired
private AppOrderFinanceMapper appOrderFinanceMapper;
@Autowired
private UserInfoUtil userInfoUtil;
/**
* 录入订单
* @param appOrder 订单主体
* @param appOrderCarList 订单车辆信息
* @param appOrderVoucherList 订单凭证信息
* @param appOrderFinanceList 订单金额信息
*/
@Override
@Transactional(rollbackFor = Exception.class)
public void saveOrder(AppOrder appOrder, List<AppOrderCar> appOrderCarList, List<AppOrderVoucher> appOrderVoucherList, List<AppOrderFinance> appOrderFinanceList) {
// 获取当前用户信息
MLoginUser user =userInfoUtil.getUserInfo();
// 生成唯一订单号
appOrder.setOrderNum(
MessageFormat.format("{0}{1}{3}",
"CXSC",
DateUtil.format(new Date(), DatePattern.PURE_DATETIME_MS_PATTERN),
String.valueOf(new Snowflake(1, 1).nextId()))
);
appOrder.setStatus(0); // 默认未生效
// 当前登录用户
appOrder.setCreateBy(user.getNickName());
appOrderMapper.insert(appOrder);
if(appOrderCarList!=null && appOrderCarList.size()>0) {
for(AppOrderCar entity:appOrderCarList) {
//外键设置
entity.setOrderFkId(appOrder.getId());
appOrderCarMapper.insert(entity);
}
}
if(appOrderVoucherList!=null && appOrderVoucherList.size()>0) {
for(AppOrderVoucher entity:appOrderVoucherList) {
//外键设置
entity.setOrderFkId(appOrder.getId());
appOrderVoucherMapper.insert(entity);
}
}
if(appOrderFinanceList!=null && appOrderFinanceList.size()>0) {
for(AppOrderFinance entity:appOrderFinanceList) {
//外键设置
entity.setOrderFkId(appOrder.getId());
appOrderFinanceMapper.insert(entity);
}
}
}
@Override
public String addOrderContract(AppOrder appOrder) {
// 拼接文本的实体信息
OrderInfo orderInfo = new OrderInfo();
BeanUtils.copyProperties(appOrder, orderInfo);
// 查询订单车辆信息
QueryWrapper<AppOrderCar> orderCarQueryWrapper = new QueryWrapper<>();
orderCarQueryWrapper.eq("order_fk_id",appOrder.getId());
AppOrderCar appOrderCar = appOrderCarMapper.selectOne(orderCarQueryWrapper);
BeanUtils.copyProperties(appOrderCar,orderInfo);
// 查询订单凭证信息
QueryWrapper<AppOrderVoucher> orderVoucherQueryWrapper = new QueryWrapper<>();
orderVoucherQueryWrapper.eq("order_fk_id",appOrder.getId());
AppOrderVoucher appOrderVoucher = appOrderVoucherMapper.selectOne(orderVoucherQueryWrapper);
BeanUtils.copyProperties(appOrderVoucher, orderInfo);
// 查询订单金额信息
QueryWrapper<AppOrderFinance> orderFinanceQueryWrapper = new QueryWrapper<>();
orderFinanceQueryWrapper.eq("order_fk_id",appOrder.getId());
AppOrderFinance appOrderFinance = appOrderFinanceMapper.selectOne(orderFinanceQueryWrapper);
BeanUtils.copyProperties(appOrderFinance, orderInfo);
String contractUrl = null;
// pdf 文件表单填充
// 1.定义输出临时路径
String outputPath = "/Users/tanzs/Downloads/" + appOrder.getOrderNum() +".pdf";
// 2.转换实体类到 Map
try {
Map<String,String> formData = jsonToMap(JSONObject.toJSONString(orderInfo));
log.info("FormData: " + JSONObject.toJSONString(formData));
//3. 拼接 pdf
fillPdfFormFromUrl(appOrder.getProductContractTemp(),outputPath,formData,6.5f);
//4. 调用合同上传 oss
} catch (Exception e) {
log.error("合同生成失败,订单编号:{}",appOrder.getOrderNum());
throw new RuntimeException(e);
}
return contractUrl;
}
}

+ 86
- 6
jeecg-module-miniapp/src/main/java/org/jeecg/modules/miniapp/utils/PdfFormUtils.java View File

@ -1,13 +1,18 @@
package org.jeecg.modules.miniapp.utils;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.itextpdf.forms.PdfAcroForm;
import com.itextpdf.forms.fields.PdfFormField;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfName;
import com.itextpdf.kernel.pdf.PdfReader;
import com.itextpdf.kernel.pdf.PdfWriter;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.lang.reflect.Type;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
@ -19,6 +24,8 @@ import java.util.Map;
*/
public class PdfFormUtils {
private static final Gson gson = new Gson();
/**
* 通过 pdf 文本域拼接 PDF 表单
@ -107,23 +114,96 @@ public class PdfFormUtils {
}
public static void fillPdfFormFromUrl2(String templateUrl, String outputPath, Map<String, String> formData, float fontSize) {
try {
// URL 获取输入流
URL url = new URL(templateUrl);
try (InputStream templateInputStream = url.openStream();
PdfWriter writer = new PdfWriter(outputPath);
PdfDocument pdfDoc = new PdfDocument(new PdfReader(templateInputStream), writer)) {
// 获取表单
PdfAcroForm form = PdfAcroForm.getAcroForm(pdfDoc, true);
// 打印所有字段名称
Map<String, PdfFormField> fields = form.getAllFormFields();
for (String fieldName : fields.keySet()) {
System.out.println("Field name: " + fieldName);
}
// 填写表单字段
for (Map.Entry<String, String> entry : formData.entrySet()) {
String fieldName = entry.getKey();
String fieldValue = entry.getValue();
PdfFormField field = fields.get(fieldName);
if (field != null && field.getFormType() == PdfName.Tx) { // 检查是否为文本字段
field.setValue(fieldValue);
field.setFontSize(fontSize);
} else {
System.out.println("Field not found or not a text field: " + fieldName);
}
}
// 可选扁平化表单使字段不可编辑
form.flattenFields();
} catch (IOException e) {
e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 实体类转换成Map
* @param obj
* @return
* @throws IllegalAccessException
*/
public static Map<String, String> convertToMap(Object obj) throws IllegalAccessException {
Map<String, String> map = new HashMap<>();
Class<?> clazz = obj.getClass();
for (Field field : clazz.getDeclaredFields()) {
field.setAccessible(true); // 允许访问私有字段
Object value = field.get(obj);
map.put(field.getName(), value != null ? value.toString() : null); // 将值转换为字符串
}
return map;
}
/**
* JSON 字符串转换为 Map<String, String>
*
* @param json JSON 字符串
* @return Map<String, String>
*/
public static Map<String, String> jsonToMap(String json) {
Type type = new TypeToken<Map<String, String>>() {}.getType();
return gson.fromJson(json, type);
}
// 示例调用此工具类
public static void main(String[] args) {
String templatePath = "/Users/tanzs/Downloads/carT.pdf";
String templateUrl = "https://jf.sh.189.cn/minio/gov-miniapp/order_pdf/carT.pdf";
// String templateUrl = "https://jf.sh.189.cn/minio/gov-miniapp/order_pdf/carT.pdf";
String outputPath = "/Users/tanzs/Downloads/carR.pdf";
float fontSize = 6.5f; // 设置字体大小
// 填写的数据
Map<String, String> formData = new HashMap<String, String>();
formData.put("name", "张三");
formData.put("idCard", "123213");
formData.put("cust_name", "张三");
formData.put("cust_phone", "123213");
formData.put("carNo", "京A12345");
formData.put("phone", "19921199563");
formData.put("cust_address", "测试地址");
// 调用工具类进行表单填写
// fillPdfForm(templatePath, outputPath, formData, fontSize);
fillPdfFormFromUrl(templateUrl, outputPath, formData, fontSize);
fillPdfForm(templatePath, outputPath, formData, fontSize);
// fillPdfFormFromUrl(templateUrl, outputPath, formData, fontSize);
}
}

+ 31
- 0
jeecg-module-miniapp/src/main/java/org/jeecg/modules/miniapp/utils/UserInfoUtil.java View File

@ -0,0 +1,31 @@
package org.jeecg.modules.miniapp.utils;
import com.xkcoding.http.support.Http;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.formula.functions.T;
import org.apache.shiro.SecurityUtils;
import org.jeecg.common.system.vo.MLoginUser;
import org.jeecg.common.util.SpringContextUtils;
import org.springframework.stereotype.Component;
import static org.jeecg.common.system.util.JwtUtil.getUserChannelByToken;
/**
* @author tanzs
* @date 2025/2/22 17:32
*/
@Component
@Slf4j
public class UserInfoUtil {
public MLoginUser getUserInfo() {
MLoginUser mLoginUser = new MLoginUser();
String channel = getUserChannelByToken(SpringContextUtils.getHttpServletRequest());
if (channel != null && channel.equals("miniapp")) {
//获取登录用户信息
mLoginUser = (MLoginUser) SecurityUtils.getSubject().getPrincipal();
}
return mLoginUser;
}
}

Loading…
Cancel
Save