合并升级3.9.0
@ -11,7 +11,7 @@
|
||||
//import org.springframework.web.bind.annotation.GetMapping;
|
||||
//import org.springframework.web.bind.annotation.RequestMapping;
|
||||
//import org.springframework.web.bind.annotation.RestController;
|
||||
//import javax.annotation.Resource;
|
||||
//import jakarta.annotation.Resource;
|
||||
//import java.util.List;
|
||||
//
|
||||
///**
|
||||
|
||||
@ -0,0 +1,333 @@
|
||||
package org.jeecg.modules.demo.shop.controller;
|
||||
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.Parameter;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import jakarta.annotation.PostConstruct;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.jeecg.common.api.vo.Result;
|
||||
import org.jeecg.modules.demo.shop.entity.Order;
|
||||
import org.jeecg.modules.demo.shop.entity.Product;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* 商品管理模拟接口
|
||||
* 用于AI Agent通过工具帮助用户查询商品并采购的业务演示
|
||||
* @Author: chenrui
|
||||
* @Date: 2025-11-06
|
||||
*/
|
||||
@Tag(name = "商品管理Demo")
|
||||
@RestController
|
||||
@RequestMapping("/demo/shop")
|
||||
@Slf4j
|
||||
public class ShopController {
|
||||
|
||||
/**
|
||||
* 商品数据存储(内存)
|
||||
*/
|
||||
private final Map<String, Product> productStore = new ConcurrentHashMap<>();
|
||||
|
||||
/**
|
||||
* 订单数据存储(内存)
|
||||
*/
|
||||
private final Map<String, Order> orderStore = new ConcurrentHashMap<>();
|
||||
|
||||
/**
|
||||
* 订单ID生成器
|
||||
*/
|
||||
private final AtomicInteger orderIdGenerator = new AtomicInteger(1000);
|
||||
|
||||
/**
|
||||
* 初始化商品数据
|
||||
*
|
||||
* @author chenrui
|
||||
* @date 2025/11/6 14:30
|
||||
*/
|
||||
@PostConstruct
|
||||
public void initProducts() {
|
||||
// 电子产品
|
||||
productStore.put("P001", new Product("P001", "iPhone 15 Pro", new BigDecimal("7999.00"), "电子产品", "Apple最新旗舰手机,6.1英寸屏幕,钛金属边框", 50));
|
||||
productStore.put("P002", new Product("P002", "MacBook Pro 14", new BigDecimal("14999.00"), "电子产品", "M3 Pro芯片,16GB内存,512GB存储", 30));
|
||||
productStore.put("P003", new Product("P003", "AirPods Pro 2", new BigDecimal("1899.00"), "电子产品", "主动降噪无线耳机,支持空间音频", 100));
|
||||
productStore.put("P004", new Product("P004", "iPad Air", new BigDecimal("4799.00"), "电子产品", "10.9英寸液晶显示屏,M1芯片", 60));
|
||||
|
||||
// 图书
|
||||
productStore.put("B001", new Product("B001", "Java核心技术卷I", new BigDecimal("119.00"), "图书", "Java编程经典教材,适合初学者和进阶开发者", 200));
|
||||
productStore.put("B002", new Product("B002", "深入理解计算机系统", new BigDecimal("139.00"), "图书", "CSAPP经典教材,计算机系统必读书籍", 150));
|
||||
productStore.put("B003", new Product("B003", "设计模式", new BigDecimal("89.00"), "图书", "软件设计经典著作,GoF四人组著作", 180));
|
||||
|
||||
// 生活用品
|
||||
productStore.put("L001", new Product("L001", "小米电动牙刷", new BigDecimal("199.00"), "生活用品", "声波震动,IPX7防水,续航18天", 300));
|
||||
productStore.put("L002", new Product("L002", "戴森吹风机", new BigDecimal("2990.00"), "生活用品", "快速干发,智能温控,保护头发", 80));
|
||||
productStore.put("L003", new Product("L003", "膳魔师保温杯", new BigDecimal("259.00"), "生活用品", "真空保温,304不锈钢,保温12小时", 500));
|
||||
|
||||
// 食品
|
||||
productStore.put("F001", new Product("F001", "三只松鼠坚果礼盒", new BigDecimal("159.00"), "食品", "混合坚果大礼包,1500g装", 400));
|
||||
productStore.put("F002", new Product("F002", "茅台飞天53度", new BigDecimal("2899.00"), "食品", "贵州茅台酒,500ml", 20));
|
||||
productStore.put("F003", new Product("F003", "星巴克咖啡豆", new BigDecimal("128.00"), "食品", "中度烘焙,派克市场,250g", 250));
|
||||
|
||||
log.info("商品数据初始化完成,共{}个商品", productStore.size());
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询商品列表
|
||||
*
|
||||
* @param category 商品分类(可选)
|
||||
* @param keyword 搜索关键词(可选)
|
||||
* @return 商品列表
|
||||
* @author chenrui
|
||||
* @date 2025/11/6 14:30
|
||||
*/
|
||||
@Operation(summary = "查询商品列表", description = "支持按分类和关键词搜索")
|
||||
@GetMapping("/products")
|
||||
public Result<List<Product>> getProducts(
|
||||
@Parameter(description = "商品分类") @RequestParam(required = false) String category,
|
||||
@Parameter(description = "搜索关键词") @RequestParam(required = false) String keyword) {
|
||||
|
||||
log.info("查询商品列表 - 分类: {}, 关键词: {}", category, keyword);
|
||||
|
||||
List<Product> products = new ArrayList<>(productStore.values());
|
||||
|
||||
// 按分类过滤
|
||||
if (category != null && !category.trim().isEmpty()) {
|
||||
products = products.stream()
|
||||
.filter(p -> category.equals(p.getCategory()))
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
// 按关键词过滤(搜索商品名称和描述)
|
||||
if (keyword != null && !keyword.trim().isEmpty()) {
|
||||
String searchKey = keyword.toLowerCase();
|
||||
products = products.stream()
|
||||
.filter(p -> p.getName().toLowerCase().contains(searchKey)
|
||||
|| p.getDescription().toLowerCase().contains(searchKey))
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
// 按价格排序
|
||||
products.sort(Comparator.comparing(Product::getPrice));
|
||||
|
||||
log.info("查询到{}个商品", products.size());
|
||||
return Result.OK(products);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询商品库存
|
||||
*
|
||||
* @param productId 商品ID
|
||||
* @return 库存信息
|
||||
* @author chenrui
|
||||
* @date 2025/11/6 14:30
|
||||
*/
|
||||
@Operation(summary = "查询商品库存", description = "根据商品ID查询库存数量")
|
||||
@GetMapping("/stock")
|
||||
public Result<Map<String, Object>> getStock(
|
||||
@Parameter(description = "商品ID", required = true) @RequestParam String productId) {
|
||||
|
||||
log.info("查询商品库存 - 商品ID: {}", productId);
|
||||
|
||||
Product product = productStore.get(productId);
|
||||
if (product == null) {
|
||||
return Result.error("商品不存在: " + productId);
|
||||
}
|
||||
|
||||
Map<String, Object> stockInfo = new HashMap<>();
|
||||
stockInfo.put("productId", product.getId());
|
||||
stockInfo.put("productName", product.getName());
|
||||
stockInfo.put("stock", product.getStock());
|
||||
stockInfo.put("available", product.getStock() > 0);
|
||||
|
||||
return Result.OK(stockInfo);
|
||||
}
|
||||
|
||||
/**
|
||||
* 购买商品(下单)
|
||||
*
|
||||
* @param productId 商品ID
|
||||
* @param quantity 购买数量
|
||||
* @param userId 用户ID(可选)
|
||||
* @return 订单信息
|
||||
* @author chenrui
|
||||
* @date 2025/11/6 14:30
|
||||
*/
|
||||
@Operation(summary = "购买商品", description = "创建订单,但不立即扣减库存")
|
||||
@PostMapping("/purchase")
|
||||
public Result<Order> purchase(
|
||||
@Parameter(description = "商品ID", required = true) @RequestParam String productId,
|
||||
@Parameter(description = "购买数量", required = true) @RequestParam Integer quantity,
|
||||
@Parameter(description = "用户ID") @RequestParam(required = false) String userId) {
|
||||
|
||||
log.info("购买商品 - 商品ID: {}, 数量: {}, 用户: {}", productId, quantity, userId);
|
||||
|
||||
// 参数校验
|
||||
if (quantity == null || quantity <= 0) {
|
||||
return Result.error("购买数量必须大于0");
|
||||
}
|
||||
|
||||
// 查询商品
|
||||
Product product = productStore.get(productId);
|
||||
if (product == null) {
|
||||
return Result.error("商品不存在: " + productId);
|
||||
}
|
||||
|
||||
// 检查库存
|
||||
if (product.getStock() < quantity) {
|
||||
return Result.error("库存不足,当前库存: " + product.getStock());
|
||||
}
|
||||
|
||||
// 创建订单
|
||||
String orderId = "O" + orderIdGenerator.incrementAndGet();
|
||||
BigDecimal totalAmount = product.getPrice().multiply(new BigDecimal(quantity));
|
||||
|
||||
Order order = new Order();
|
||||
order.setId(orderId);
|
||||
order.setProductId(productId);
|
||||
order.setProductName(product.getName());
|
||||
order.setQuantity(quantity);
|
||||
order.setUnitPrice(product.getPrice());
|
||||
order.setTotalAmount(totalAmount);
|
||||
order.setStatus("pending");
|
||||
order.setCreateTime(new Date());
|
||||
order.setUserId(userId);
|
||||
|
||||
orderStore.put(orderId, order);
|
||||
|
||||
log.info("订单创建成功 - 订单ID: {}, 总金额: {}", orderId, totalAmount);
|
||||
return Result.OK(order);
|
||||
}
|
||||
|
||||
/**
|
||||
* 扣减商品库存
|
||||
*
|
||||
* @param orderId 订单ID
|
||||
* @return 扣减结果
|
||||
* @author chenrui
|
||||
* @date 2025/11/6 14:30
|
||||
*/
|
||||
@Operation(summary = "扣减商品库存", description = "根据订单ID扣减对应商品库存")
|
||||
@PostMapping("/stock/deduct")
|
||||
public Result<Map<String, Object>> deductStock(
|
||||
@Parameter(description = "订单ID", required = true) @RequestParam String orderId) {
|
||||
|
||||
log.info("扣减库存 - 订单ID: {}", orderId);
|
||||
|
||||
// 查询订单
|
||||
Order order = orderStore.get(orderId);
|
||||
if (order == null) {
|
||||
return Result.error("订单不存在: " + orderId);
|
||||
}
|
||||
|
||||
// 检查订单状态
|
||||
if ("paid".equals(order.getStatus())) {
|
||||
return Result.error("订单已支付,库存已扣减");
|
||||
}
|
||||
|
||||
if ("cancelled".equals(order.getStatus())) {
|
||||
return Result.error("订单已取消");
|
||||
}
|
||||
|
||||
// 查询商品
|
||||
Product product = productStore.get(order.getProductId());
|
||||
if (product == null) {
|
||||
return Result.error("商品不存在: " + order.getProductId());
|
||||
}
|
||||
|
||||
// 检查库存
|
||||
synchronized (product) {
|
||||
if (product.getStock() < order.getQuantity()) {
|
||||
return Result.error("库存不足,当前库存: " + product.getStock() + ", 需要: " + order.getQuantity());
|
||||
}
|
||||
|
||||
// 扣减库存
|
||||
int newStock = product.getStock() - order.getQuantity();
|
||||
product.setStock(newStock);
|
||||
|
||||
// 更新订单状态
|
||||
order.setStatus("paid");
|
||||
|
||||
log.info("库存扣减成功 - 商品: {}, 扣减数量: {}, 剩余库存: {}",
|
||||
product.getName(), order.getQuantity(), newStock);
|
||||
}
|
||||
|
||||
Map<String, Object> result = new HashMap<>();
|
||||
result.put("orderId", orderId);
|
||||
result.put("productId", product.getId());
|
||||
result.put("productName", product.getName());
|
||||
result.put("deductedQuantity", order.getQuantity());
|
||||
result.put("remainingStock", product.getStock());
|
||||
result.put("orderStatus", order.getStatus());
|
||||
|
||||
return Result.OK(result);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询订单详情
|
||||
*
|
||||
* @param orderId 订单ID
|
||||
* @return 订单详情
|
||||
* @author chenrui
|
||||
* @date 2025/11/6 14:30
|
||||
*/
|
||||
@Operation(summary = "查询订单详情", description = "根据订单ID查询订单信息")
|
||||
@GetMapping("/order")
|
||||
public Result<Order> getOrder(
|
||||
@Parameter(description = "订单ID", required = true) @RequestParam String orderId) {
|
||||
|
||||
log.info("查询订单 - 订单ID: {}", orderId);
|
||||
|
||||
Order order = orderStore.get(orderId);
|
||||
if (order == null) {
|
||||
return Result.error("订单不存在: " + orderId);
|
||||
}
|
||||
|
||||
return Result.OK(order);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取所有商品分类
|
||||
*
|
||||
* @return 分类列表
|
||||
* @author chenrui
|
||||
* @date 2025/11/6 14:30
|
||||
*/
|
||||
@Operation(summary = "获取商品分类", description = "获取所有商品的分类列表")
|
||||
@GetMapping("/categories")
|
||||
public Result<List<String>> getCategories() {
|
||||
|
||||
Set<String> categories = productStore.values().stream()
|
||||
.map(Product::getCategory)
|
||||
.collect(Collectors.toSet());
|
||||
|
||||
List<String> categoryList = new ArrayList<>(categories);
|
||||
categoryList.sort(String::compareTo);
|
||||
|
||||
return Result.OK(categoryList);
|
||||
}
|
||||
|
||||
/**
|
||||
* 重置所有数据(仅用于测试)
|
||||
*
|
||||
* @return 重置结果
|
||||
* @author chenrui
|
||||
* @date 2025/11/6 14:30
|
||||
*/
|
||||
@Operation(summary = "重置数据", description = "清空所有订单并重置商品库存(仅用于测试)")
|
||||
@PostMapping("/reset")
|
||||
public Result<String> reset() {
|
||||
|
||||
log.info("重置商品和订单数据");
|
||||
|
||||
orderStore.clear();
|
||||
orderIdGenerator.set(1000);
|
||||
productStore.clear();
|
||||
initProducts();
|
||||
|
||||
return Result.OK("数据重置成功");
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,64 @@
|
||||
package org.jeecg.modules.demo.shop.entity;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* 订单实体
|
||||
* @Author: chenrui
|
||||
* @Date: 2025-11-06
|
||||
*/
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class Order {
|
||||
|
||||
/**
|
||||
* 订单ID
|
||||
*/
|
||||
private String id;
|
||||
|
||||
/**
|
||||
* 商品ID
|
||||
*/
|
||||
private String productId;
|
||||
|
||||
/**
|
||||
* 商品名称
|
||||
*/
|
||||
private String productName;
|
||||
|
||||
/**
|
||||
* 购买数量
|
||||
*/
|
||||
private Integer quantity;
|
||||
|
||||
/**
|
||||
* 单价
|
||||
*/
|
||||
private BigDecimal unitPrice;
|
||||
|
||||
/**
|
||||
* 总金额
|
||||
*/
|
||||
private BigDecimal totalAmount;
|
||||
|
||||
/**
|
||||
* 订单状态: pending-待支付, paid-已支付, cancelled-已取消
|
||||
*/
|
||||
private String status;
|
||||
|
||||
/**
|
||||
* 创建时间
|
||||
*/
|
||||
private Date createTime;
|
||||
|
||||
/**
|
||||
* 用户信息(可选)
|
||||
*/
|
||||
private String userId;
|
||||
}
|
||||
@ -0,0 +1,48 @@
|
||||
package org.jeecg.modules.demo.shop.entity;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
|
||||
/**
|
||||
* 商品实体
|
||||
* @Author: chenrui
|
||||
* @Date: 2025-11-06
|
||||
*/
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class Product {
|
||||
|
||||
/**
|
||||
* 商品ID
|
||||
*/
|
||||
private String id;
|
||||
|
||||
/**
|
||||
* 商品名称
|
||||
*/
|
||||
private String name;
|
||||
|
||||
/**
|
||||
* 商品价格
|
||||
*/
|
||||
private BigDecimal price;
|
||||
|
||||
/**
|
||||
* 商品分类
|
||||
*/
|
||||
private String category;
|
||||
|
||||
/**
|
||||
* 商品描述
|
||||
*/
|
||||
private String description;
|
||||
|
||||
/**
|
||||
* 库存数量
|
||||
*/
|
||||
private Integer stock;
|
||||
}
|
||||
@ -1,438 +0,0 @@
|
||||
package org.jeecg.modules.dlglong.controller;
|
||||
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.alibaba.fastjson.JSONArray;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.io.IOUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.jeecg.common.api.vo.Result;
|
||||
import org.jeecg.common.system.query.MatchTypeEnum;
|
||||
import org.jeecg.common.system.query.QueryCondition;
|
||||
import org.jeecg.common.system.query.QueryGenerator;
|
||||
import org.jeecg.common.constant.VxeSocketConst;
|
||||
import org.jeecg.modules.demo.mock.vxe.websocket.VxeSocket;
|
||||
import org.jeecg.modules.dlglong.entity.MockEntity;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import jakarta.servlet.http.HttpServletRequest;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.net.URLDecoder;
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* @Description: DlMockController
|
||||
* @author: jeecg-boot
|
||||
*/
|
||||
@Slf4j
|
||||
@RestController
|
||||
@RequestMapping("/mock/dlglong")
|
||||
public class DlMockController {
|
||||
|
||||
/**
|
||||
* 模拟更改状态
|
||||
*
|
||||
* @param id
|
||||
* @param status
|
||||
* @return
|
||||
*/
|
||||
@GetMapping("/change1")
|
||||
public Result mockChange1(@RequestParam("id") String id, @RequestParam("status") String status) {
|
||||
/* id 为 行的id(rowId),只要获取到rowId,那么只需要调用 VXESocket.sendMessageToAll() 即可 */
|
||||
|
||||
// 封装行数据
|
||||
JSONObject rowData = new JSONObject();
|
||||
// 这个字段就是要更改的行数据ID
|
||||
rowData.put("id", id);
|
||||
// 这个字段就是要更改的列的key和具体的值
|
||||
rowData.put("status", status);
|
||||
// 模拟更改数据
|
||||
this.mockChange(rowData);
|
||||
|
||||
return Result.ok();
|
||||
}
|
||||
|
||||
/**
|
||||
* 模拟更改拖轮状态
|
||||
*
|
||||
* @param id
|
||||
* @param tugStatus
|
||||
* @return
|
||||
*/
|
||||
@GetMapping("/change2")
|
||||
public Result mockChange2(@RequestParam("id") String id, @RequestParam("tug_status") String tugStatus) {
|
||||
/* id 为 行的id(rowId),只要获取到rowId,那么只需要调用 VXESocket.sendMessageToAll() 即可 */
|
||||
|
||||
// 封装行数据
|
||||
JSONObject rowData = new JSONObject();
|
||||
// 这个字段就是要更改的行数据ID
|
||||
rowData.put("id", id);
|
||||
// 这个字段就是要更改的列的key和具体的值
|
||||
JSONObject status = JSON.parseObject(tugStatus);
|
||||
rowData.put("tug_status", status);
|
||||
// 模拟更改数据
|
||||
this.mockChange(rowData);
|
||||
|
||||
return Result.ok();
|
||||
}
|
||||
|
||||
/**
|
||||
* 模拟更改进度条状态
|
||||
*
|
||||
* @param id
|
||||
* @param progress
|
||||
* @return
|
||||
*/
|
||||
@GetMapping("/change3")
|
||||
public Result mockChange3(@RequestParam("id") String id, @RequestParam("progress") String progress) {
|
||||
/* id 为 行的id(rowId),只要获取到rowId,那么只需要调用 VXESocket.sendMessageToAll() 即可 */
|
||||
|
||||
// 封装行数据
|
||||
JSONObject rowData = new JSONObject();
|
||||
// 这个字段就是要更改的行数据ID
|
||||
rowData.put("id", id);
|
||||
// 这个字段就是要更改的列的key和具体的值
|
||||
rowData.put("progress", progress);
|
||||
// 模拟更改数据
|
||||
this.mockChange(rowData);
|
||||
|
||||
return Result.ok();
|
||||
}
|
||||
|
||||
private void mockChange(JSONObject rowData) {
|
||||
// 封装socket数据
|
||||
JSONObject socketData = new JSONObject();
|
||||
// 这里的 socketKey 必须要和调度计划页面上写的 socketKey 属性保持一致
|
||||
socketData.put("socketKey", "page-dispatch");
|
||||
// 这里的 args 必须得是一个数组,下标0是行数据,下标1是caseId,一般不用传
|
||||
socketData.put("args", new Object[]{rowData, ""});
|
||||
// 封装消息字符串,这里的 type 必须是 VXESocketConst.TYPE_UVT
|
||||
String message = VxeSocket.packageMessage(VxeSocketConst.TYPE_UVT, socketData);
|
||||
// 调用 sendMessageToAll 发送给所有在线的用户
|
||||
VxeSocket.sendMessageToAll(message);
|
||||
}
|
||||
|
||||
/**
|
||||
* 模拟更改【大船待审】状态
|
||||
*
|
||||
* @param status
|
||||
* @return
|
||||
*/
|
||||
@GetMapping("/change4")
|
||||
public Result mockChange4(@RequestParam("status") String status) {
|
||||
// 封装socket数据
|
||||
JSONObject socketData = new JSONObject();
|
||||
// 这里的 key 是前端注册时使用的key,必须保持一致
|
||||
socketData.put("key", "dispatch-dcds-status");
|
||||
// 这里的 args 必须得是一个数组,每一位都是注册方法的参数,按顺序传递
|
||||
socketData.put("args", new Object[]{status});
|
||||
|
||||
// 封装消息字符串,这里的 type 必须是 VXESocketConst.TYPE_UVT
|
||||
String message = VxeSocket.packageMessage(VxeSocketConst.TYPE_CSD, socketData);
|
||||
// 调用 sendMessageToAll 发送给所有在线的用户
|
||||
VxeSocket.sendMessageToAll(message);
|
||||
|
||||
return Result.ok();
|
||||
}
|
||||
|
||||
/**
|
||||
* 【模拟】即时保存单行数据
|
||||
*
|
||||
* @param rowData 行数据,实际使用时可以替换成一个实体类
|
||||
*/
|
||||
@PutMapping("/immediateSaveRow")
|
||||
public Result mockImmediateSaveRow(@RequestBody JSONObject rowData) throws Exception {
|
||||
System.out.println("即时保存.rowData:" + rowData.toJSONString());
|
||||
// 延时1.5秒,模拟网慢堵塞真实感
|
||||
Thread.sleep(500);
|
||||
return Result.ok();
|
||||
}
|
||||
|
||||
/**
|
||||
* 【模拟】即时保存整个表格的数据
|
||||
*
|
||||
* @param tableData 表格数据(实际使用时可以替换成一个List实体类)
|
||||
*/
|
||||
@PostMapping("/immediateSaveAll")
|
||||
public Result mockImmediateSaveAll(@RequestBody JSONArray tableData) throws Exception {
|
||||
// 【注】:
|
||||
// 1、tableData里包含该页所有的数据
|
||||
// 2、如果你实现了“即时保存”,那么除了新增的数据,其他的都是已经保存过的了,
|
||||
// 不需要再进行一次update操作了,所以可以在前端传数据的时候就遍历判断一下,
|
||||
// 只传新增的数据给后台insert即可,否者将会造成性能上的浪费。
|
||||
// 3、新增的行是没有id的,通过这一点,就可以判断是否是新增的数据
|
||||
|
||||
System.out.println("即时保存.tableData:" + tableData.toJSONString());
|
||||
// 延时1.5秒,模拟网慢堵塞真实感
|
||||
Thread.sleep(1000);
|
||||
return Result.ok();
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取模拟数据
|
||||
*
|
||||
* @param pageNo 页码
|
||||
* @param pageSize 页大小
|
||||
* @param parentId 父ID,不传则查询顶级
|
||||
* @return
|
||||
*/
|
||||
@GetMapping("/getData")
|
||||
public Result getMockData(
|
||||
@RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
|
||||
@RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
|
||||
// 父级id,根据父级id查询子级,如果为空则查询顶级
|
||||
@RequestParam(name = "parentId", required = false) String parentId
|
||||
) {
|
||||
// 模拟JSON数据路径
|
||||
String path = "classpath:org/jeecg/modules/dlglong/json/dlglong.json";
|
||||
// 读取JSON数据
|
||||
JSONArray dataList = readJsonData(path);
|
||||
if (dataList == null) {
|
||||
return Result.error("读取数据失败!");
|
||||
}
|
||||
IPage<JSONObject> page = this.queryDataPage(dataList, parentId, pageNo, pageSize);
|
||||
return Result.ok(page);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取模拟“调度计划”页面的数据
|
||||
*
|
||||
* @param pageNo 页码
|
||||
* @param pageSize 页大小
|
||||
* @param parentId 父ID,不传则查询顶级
|
||||
* @return
|
||||
*/
|
||||
@GetMapping("/getDdjhData")
|
||||
public Result getMockDdjhData(
|
||||
// SpringMVC 会自动将参数注入到实体里
|
||||
MockEntity mockEntity,
|
||||
@RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
|
||||
@RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
|
||||
// 父级id,根据父级id查询子级,如果为空则查询顶级
|
||||
@RequestParam(name = "parentId", required = false) String parentId,
|
||||
@RequestParam(name = "status", required = false) String status,
|
||||
// 高级查询条件
|
||||
@RequestParam(name = "superQueryParams", required = false) String superQueryParams,
|
||||
// 高级查询模式
|
||||
@RequestParam(name = "superQueryMatchType", required = false) String superQueryMatchType,
|
||||
HttpServletRequest request
|
||||
) {
|
||||
// 获取查询条件(前台传递的查询参数)
|
||||
Map<String, String[]> parameterMap = request.getParameterMap();
|
||||
// 遍历输出到控制台
|
||||
System.out.println("\ngetDdjhData - 普通查询条件:");
|
||||
for (String key : parameterMap.keySet()) {
|
||||
System.out.println("-- " + key + ": " + JSON.toJSONString(parameterMap.get(key)));
|
||||
}
|
||||
// 输出高级查询
|
||||
try {
|
||||
System.out.println("\ngetDdjhData - 高级查询条件:");
|
||||
// 高级查询模式
|
||||
MatchTypeEnum matchType = MatchTypeEnum.getByValue(superQueryMatchType);
|
||||
if (matchType == null) {
|
||||
System.out.println("-- 高级查询模式:不识别(" + superQueryMatchType + ")");
|
||||
} else {
|
||||
System.out.println("-- 高级查询模式:" + matchType.getValue());
|
||||
}
|
||||
superQueryParams = URLDecoder.decode(superQueryParams, "UTF-8");
|
||||
List<QueryCondition> conditions = JSON.parseArray(superQueryParams, QueryCondition.class);
|
||||
if (conditions != null) {
|
||||
for (QueryCondition condition : conditions) {
|
||||
System.out.println("-- " + JSON.toJSONString(condition));
|
||||
}
|
||||
} else {
|
||||
System.out.println("-- 没有传递任何高级查询条件");
|
||||
}
|
||||
System.out.println();
|
||||
} catch (Exception e) {
|
||||
log.error("-- 高级查询操作失败:" + superQueryParams, e);
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
/* 注:实际使用中不用写上面那种繁琐的代码,这里只是为了直观的输出到控制台里而写的示例,
|
||||
使用下面这种写法更简洁方便 */
|
||||
|
||||
// 封装成 MyBatisPlus 能识别的 QueryWrapper,可以直接使用这个对象进行SQL筛选条件拼接
|
||||
// 这个方法也会自动封装高级查询条件,但是高级查询参数名必须是superQueryParams和superQueryMatchType
|
||||
QueryWrapper<MockEntity> queryWrapper = QueryGenerator.initQueryWrapper(mockEntity, parameterMap);
|
||||
System.out.println("queryWrapper: " + queryWrapper.getCustomSqlSegment());
|
||||
|
||||
// 模拟JSON数据路径
|
||||
String path = "classpath:org/jeecg/modules/dlglong/json/ddjh.json";
|
||||
String statusValue = "8";
|
||||
if (statusValue.equals(status)) {
|
||||
path = "classpath:org/jeecg/modules/dlglong/json/ddjh_s8.json";
|
||||
}
|
||||
// 读取JSON数据
|
||||
JSONArray dataList = readJsonData(path);
|
||||
if (dataList == null) {
|
||||
return Result.error("读取数据失败!");
|
||||
}
|
||||
|
||||
IPage<JSONObject> page = this.queryDataPage(dataList, parentId, pageNo, pageSize);
|
||||
// 逐行查询子表数据,用于计算拖轮状态
|
||||
List<JSONObject> records = page.getRecords();
|
||||
for (JSONObject record : records) {
|
||||
Map<String, Integer> tugStatusMap = new HashMap<>(5);
|
||||
String id = record.getString("id");
|
||||
// 查询出主表的拖轮
|
||||
String tugMain = record.getString("tug");
|
||||
// 判断是否有值
|
||||
if (StringUtils.isNotBlank(tugMain)) {
|
||||
// 拖轮根据分号分割
|
||||
String[] tugs = tugMain.split(";");
|
||||
// 查询子表数据
|
||||
List<JSONObject> subRecords = this.queryDataPage(dataList, id, null, null).getRecords();
|
||||
// 遍历子表和拖轮数据,找出进行计算反推拖轮状态
|
||||
for (JSONObject subData : subRecords) {
|
||||
String subTug = subData.getString("tug");
|
||||
if (StringUtils.isNotBlank(subTug)) {
|
||||
for (String tug : tugs) {
|
||||
if (tug.equals(subTug)) {
|
||||
// 计算拖轮状态逻辑
|
||||
int statusCode = 0;
|
||||
|
||||
/* 如果有发船时间、作业开始时间、作业结束时间、回船时间,则主表中的拖轮列中的每个拖轮背景色要即时变色 */
|
||||
|
||||
// 有发船时间,状态 +1
|
||||
String departureTime = subData.getString("departure_time");
|
||||
if (StringUtils.isNotBlank(departureTime)) {
|
||||
statusCode += 1;
|
||||
}
|
||||
// 有作业开始时间,状态 +1
|
||||
String workBeginTime = subData.getString("work_begin_time");
|
||||
if (StringUtils.isNotBlank(workBeginTime)) {
|
||||
statusCode += 1;
|
||||
}
|
||||
// 有作业结束时间,状态 +1
|
||||
String workEndTime = subData.getString("work_end_time");
|
||||
if (StringUtils.isNotBlank(workEndTime)) {
|
||||
statusCode += 1;
|
||||
}
|
||||
// 有回船时间,状态 +1
|
||||
String returnTime = subData.getString("return_time");
|
||||
if (StringUtils.isNotBlank(returnTime)) {
|
||||
statusCode += 1;
|
||||
}
|
||||
// 保存拖轮状态,key是拖轮的值,value是状态,前端根据不同的状态码,显示不同的颜色,这个颜色也可以后台计算完之后返回给前端直接使用
|
||||
tugStatusMap.put(tug, statusCode);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// 新加一个字段用于保存拖轮状态,不要直接覆盖原来的,这个字段可以不保存到数据库里
|
||||
record.put("tug_status", tugStatusMap);
|
||||
}
|
||||
page.setRecords(records);
|
||||
return Result.ok(page);
|
||||
}
|
||||
|
||||
/**
|
||||
* 模拟查询数据,可以根据父ID查询,可以分页
|
||||
*
|
||||
* @param dataList 数据列表
|
||||
* @param parentId 父ID
|
||||
* @param pageNo 页码
|
||||
* @param pageSize 页大小
|
||||
* @return
|
||||
*/
|
||||
private IPage<JSONObject> queryDataPage(JSONArray dataList, String parentId, Integer pageNo, Integer pageSize) {
|
||||
// 根据父级id查询子级
|
||||
JSONArray dataDb = dataList;
|
||||
if (StringUtils.isNotBlank(parentId)) {
|
||||
JSONArray results = new JSONArray();
|
||||
List<String> parentIds = Arrays.asList(parentId.split(","));
|
||||
this.queryByParentId(dataDb, parentIds, results);
|
||||
dataDb = results;
|
||||
}
|
||||
// 模拟分页(实际中应用SQL自带的分页)
|
||||
List<JSONObject> records = new ArrayList<>();
|
||||
IPage<JSONObject> page;
|
||||
long beginIndex, endIndex;
|
||||
// 如果任意一个参数为null,则不分页
|
||||
if (pageNo == null || pageSize == null) {
|
||||
page = new Page<>(0, dataDb.size());
|
||||
beginIndex = 0;
|
||||
endIndex = dataDb.size();
|
||||
} else {
|
||||
page = new Page<>(pageNo, pageSize);
|
||||
beginIndex = page.offset();
|
||||
endIndex = page.offset() + page.getSize();
|
||||
}
|
||||
for (long i = beginIndex; (i < endIndex && i < dataDb.size()); i++) {
|
||||
JSONObject data = dataDb.getJSONObject((int) i);
|
||||
data = JSON.parseObject(data.toJSONString());
|
||||
// 不返回 children
|
||||
data.remove("children");
|
||||
records.add(data);
|
||||
}
|
||||
page.setRecords(records);
|
||||
page.setTotal(dataDb.size());
|
||||
return page;
|
||||
}
|
||||
|
||||
private void queryByParentId(JSONArray dataList, List<String> parentIds, JSONArray results) {
|
||||
for (int i = 0; i < dataList.size(); i++) {
|
||||
JSONObject data = dataList.getJSONObject(i);
|
||||
JSONArray children = data.getJSONArray("children");
|
||||
// 找到了该父级
|
||||
if (parentIds.contains(data.getString("id"))) {
|
||||
if (children != null) {
|
||||
// addAll 的目的是将多个子表的数据合并在一起
|
||||
results.addAll(children);
|
||||
}
|
||||
} else {
|
||||
if (children != null) {
|
||||
queryByParentId(children, parentIds, results);
|
||||
}
|
||||
}
|
||||
}
|
||||
results.addAll(new JSONArray());
|
||||
}
|
||||
|
||||
private JSONArray readJsonData(String path) {
|
||||
try {
|
||||
InputStream stream = getClass().getClassLoader().getResourceAsStream(path.replace("classpath:", ""));
|
||||
if (stream != null) {
|
||||
String json = IOUtils.toString(stream, "UTF-8");
|
||||
return JSON.parseArray(json);
|
||||
}
|
||||
} catch (IOException e) {
|
||||
log.error(e.getMessage(), e);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取车辆最后一个位置
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
@PostMapping("/findLatestCarLngLat")
|
||||
public List findLatestCarLngLat() {
|
||||
// 模拟JSON数据路径
|
||||
String path = "classpath:org/jeecg/modules/dlglong/json/CarLngLat.json";
|
||||
// 读取JSON数据
|
||||
return readJsonData(path);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取车辆最后一个位置
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
@PostMapping("/findCarTrace")
|
||||
public List findCarTrace() {
|
||||
// 模拟JSON数据路径
|
||||
String path = "classpath:org/jeecg/modules/dlglong/json/CarTrace.json";
|
||||
// 读取JSON数据
|
||||
return readJsonData(path);
|
||||
}
|
||||
|
||||
}
|
||||
@ -1,27 +0,0 @@
|
||||
package org.jeecg.modules.dlglong.entity;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* 模拟实体
|
||||
* @author: jeecg-boot
|
||||
*/
|
||||
@Data
|
||||
public class MockEntity {
|
||||
|
||||
/**
|
||||
* id
|
||||
*/
|
||||
private String id;
|
||||
/**
|
||||
* 父级ID
|
||||
*/
|
||||
private String parentId;
|
||||
/**
|
||||
* 状态
|
||||
*/
|
||||
private String status;
|
||||
|
||||
/* -- 省略其他字段 -- */
|
||||
|
||||
}
|
||||
@ -1,14 +0,0 @@
|
||||
[
|
||||
{
|
||||
"id": "6891ba44421aa907bcb7390c",
|
||||
"alarm": "0",
|
||||
"altitude": "13",
|
||||
"direction": "0",
|
||||
"latitude": "38.918739",
|
||||
"longitude": "117.758737",
|
||||
"speed": "11",
|
||||
"status": "4980739",
|
||||
"timestamp": "2025-08-05T16:01:07",
|
||||
"imei": "18441136860"
|
||||
}
|
||||
]
|
||||
|
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 2.9 KiB |
|
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 2.9 KiB |
|
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 2.9 KiB |
|
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 2.9 KiB |
|
Before Width: | Height: | Size: 622 KiB |
|
Before Width: | Height: | Size: 1.4 MiB |
|
Before Width: | Height: | Size: 244 KiB After Width: | Height: | Size: 143 KiB |
|
Before Width: | Height: | Size: 247 KiB After Width: | Height: | Size: 143 KiB |
|
Before Width: | Height: | Size: 4.4 KiB After Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 4.3 KiB |
|
Before Width: | Height: | Size: 6.0 KiB After Width: | Height: | Size: 2.5 KiB |
|
Before Width: | Height: | Size: 262 B After Width: | Height: | Size: 187 B |
|
Before Width: | Height: | Size: 1001 B After Width: | Height: | Size: 992 B |
|
Before Width: | Height: | Size: 380 B After Width: | Height: | Size: 333 B |
|
Before Width: | Height: | Size: 338 B After Width: | Height: | Size: 259 B |
|
Before Width: | Height: | Size: 280 B After Width: | Height: | Size: 209 B |
|
Before Width: | Height: | Size: 1015 B After Width: | Height: | Size: 1014 B |
|
Before Width: | Height: | Size: 709 B After Width: | Height: | Size: 383 B |
|
Before Width: | Height: | Size: 159 KiB After Width: | Height: | Size: 90 KiB |
|
Before Width: | Height: | Size: 183 B After Width: | Height: | Size: 164 B |
|
Before Width: | Height: | Size: 273 B After Width: | Height: | Size: 186 B |
|
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 251 B After Width: | Height: | Size: 159 B |
|
Before Width: | Height: | Size: 256 B After Width: | Height: | Size: 159 B |
|
Before Width: | Height: | Size: 333 B After Width: | Height: | Size: 307 B |
|
Before Width: | Height: | Size: 529 B After Width: | Height: | Size: 478 B |
|
Before Width: | Height: | Size: 242 B After Width: | Height: | Size: 182 B |
|
Before Width: | Height: | Size: 7.6 KiB After Width: | Height: | Size: 3.1 KiB |
|
Before Width: | Height: | Size: 317 B After Width: | Height: | Size: 302 B |
|
Before Width: | Height: | Size: 367 B After Width: | Height: | Size: 335 B |
|
Before Width: | Height: | Size: 499 B After Width: | Height: | Size: 497 B |
|
Before Width: | Height: | Size: 557 B After Width: | Height: | Size: 436 B |
|
Before Width: | Height: | Size: 711 B After Width: | Height: | Size: 512 B |
|
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 182 B After Width: | Height: | Size: 134 B |
|
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 2.5 KiB |
|
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 2.0 KiB After Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 2.4 KiB |
|
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 2.4 KiB |
|
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 328 B After Width: | Height: | Size: 227 B |
|
Before Width: | Height: | Size: 309 B After Width: | Height: | Size: 225 B |
|
Before Width: | Height: | Size: 166 B After Width: | Height: | Size: 159 B |
|
Before Width: | Height: | Size: 5.8 KiB After Width: | Height: | Size: 3.0 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 4.3 KiB |
|
Before Width: | Height: | Size: 7.5 KiB After Width: | Height: | Size: 3.1 KiB |
|
Before Width: | Height: | Size: 5.7 KiB After Width: | Height: | Size: 4.0 KiB |
|
Before Width: | Height: | Size: 701 B After Width: | Height: | Size: 701 B |
|
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 210 B After Width: | Height: | Size: 205 B |
|
Before Width: | Height: | Size: 32 KiB After Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 5.7 KiB After Width: | Height: | Size: 4.0 KiB |
|
Before Width: | Height: | Size: 701 B After Width: | Height: | Size: 701 B |
|
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 7.4 KiB After Width: | Height: | Size: 4.2 KiB |
@ -1,370 +0,0 @@
|
||||
{
|
||||
"list": [
|
||||
{
|
||||
"key": "1717072932495_439966",
|
||||
"type": "card",
|
||||
"isAutoGrid": true,
|
||||
"isContainer": true,
|
||||
"list": [
|
||||
{
|
||||
"type": "input",
|
||||
"name": "名称",
|
||||
"className": "form-input",
|
||||
"icon": "icon-input",
|
||||
"hideTitle": false,
|
||||
"options": {
|
||||
"width": "100%",
|
||||
"defaultValue": "",
|
||||
"required": true,
|
||||
"dataType": null,
|
||||
"pattern": "",
|
||||
"placeholder": "",
|
||||
"clearable": false,
|
||||
"readonly": false,
|
||||
"disabled": false,
|
||||
"fillRuleCode": "",
|
||||
"showPassword": false,
|
||||
"unique": false,
|
||||
"hidden": false,
|
||||
"hiddenOnAdd": false,
|
||||
"fieldNote": "",
|
||||
"autoWidth": 50
|
||||
},
|
||||
"advancedSetting": {
|
||||
"defaultValue": {
|
||||
"type": "compose",
|
||||
"value": "",
|
||||
"format": "string",
|
||||
"allowFunc": true,
|
||||
"valueSplit": "",
|
||||
"customConfig": false
|
||||
}
|
||||
},
|
||||
"remoteAPI": {
|
||||
"url": "",
|
||||
"executed": false
|
||||
},
|
||||
"key": "1717072932495_556479",
|
||||
"model": "input_1717072932495_556479",
|
||||
"modelType": "main",
|
||||
"rules": [
|
||||
{
|
||||
"required": true,
|
||||
"message": "${title}必须填写"
|
||||
}
|
||||
],
|
||||
"isSubItem": false
|
||||
},
|
||||
{
|
||||
"type": "number",
|
||||
"name": "数字",
|
||||
"className": "form-number",
|
||||
"icon": "icon-number",
|
||||
"hideTitle": false,
|
||||
"options": {
|
||||
"width": "",
|
||||
"required": false,
|
||||
"defaultValue": 0,
|
||||
"placeholder": "",
|
||||
"controls": false,
|
||||
"min": 0,
|
||||
"minUnlimited": true,
|
||||
"max": 100,
|
||||
"maxUnlimited": true,
|
||||
"step": 1,
|
||||
"disabled": false,
|
||||
"controlsPosition": "right",
|
||||
"unitText": "",
|
||||
"unitPosition": "suffix",
|
||||
"showPercent": false,
|
||||
"align": "left",
|
||||
"hidden": false,
|
||||
"hiddenOnAdd": false,
|
||||
"fieldNote": "",
|
||||
"autoWidth": 50
|
||||
},
|
||||
"advancedSetting": {
|
||||
"defaultValue": {
|
||||
"type": "compose",
|
||||
"value": "",
|
||||
"format": "number",
|
||||
"allowFunc": true,
|
||||
"valueSplit": "",
|
||||
"customConfig": false
|
||||
}
|
||||
},
|
||||
"remoteAPI": {
|
||||
"url": "",
|
||||
"executed": false
|
||||
},
|
||||
"key": "1717072985868_606195",
|
||||
"model": "number_1717072985868_606195",
|
||||
"modelType": "main",
|
||||
"rules": [],
|
||||
"isSubItem": false
|
||||
}
|
||||
],
|
||||
"options": {
|
||||
"required": false,
|
||||
"hiddenOnAdd": false,
|
||||
"hidden": false,
|
||||
"fieldNote": ""
|
||||
},
|
||||
"model": "card_1717072932495_439966",
|
||||
"hideTitle": false,
|
||||
"modelType": "main"
|
||||
},
|
||||
{
|
||||
"key": "1717072988159_545097",
|
||||
"type": "card",
|
||||
"isAutoGrid": true,
|
||||
"isContainer": true,
|
||||
"list": [
|
||||
{
|
||||
"type": "money",
|
||||
"name": "金额",
|
||||
"className": "form-money",
|
||||
"icon": "icon-money",
|
||||
"hideTitle": false,
|
||||
"options": {
|
||||
"width": "180px",
|
||||
"placeholder": "请输入金额",
|
||||
"required": false,
|
||||
"unitText": "元",
|
||||
"unitPosition": "suffix",
|
||||
"precision": 2,
|
||||
"hidden": false,
|
||||
"disabled": false,
|
||||
"hiddenOnAdd": false,
|
||||
"fieldNote": "",
|
||||
"autoWidth": 50
|
||||
},
|
||||
"advancedSetting": {
|
||||
"defaultValue": {
|
||||
"type": "compose",
|
||||
"value": "",
|
||||
"format": "number",
|
||||
"allowFunc": true,
|
||||
"valueSplit": "",
|
||||
"customConfig": false
|
||||
}
|
||||
},
|
||||
"remoteAPI": {
|
||||
"url": "",
|
||||
"executed": false
|
||||
},
|
||||
"key": "1717072988159_568693",
|
||||
"model": "money_1717072988159_568693",
|
||||
"modelType": "main",
|
||||
"rules": [],
|
||||
"isSubItem": false
|
||||
},
|
||||
{
|
||||
"type": "select",
|
||||
"name": "下拉选择框",
|
||||
"className": "form-select",
|
||||
"icon": "icon-select",
|
||||
"hideTitle": false,
|
||||
"options": {
|
||||
"defaultValue": "",
|
||||
"multiple": false,
|
||||
"disabled": false,
|
||||
"clearable": true,
|
||||
"placeholder": "",
|
||||
"required": false,
|
||||
"showLabel": false,
|
||||
"showType": "default",
|
||||
"width": "",
|
||||
"useColor": false,
|
||||
"colorIteratorIndex": 3,
|
||||
"options": [
|
||||
{
|
||||
"value": "下拉框1",
|
||||
"itemColor": "#2196F3"
|
||||
},
|
||||
{
|
||||
"value": "下拉框2",
|
||||
"itemColor": "#08C9C9"
|
||||
},
|
||||
{
|
||||
"value": "下拉框3",
|
||||
"itemColor": "#00C345"
|
||||
}
|
||||
],
|
||||
"remote": false,
|
||||
"filterable": false,
|
||||
"remoteOptions": [],
|
||||
"props": {
|
||||
"value": "value",
|
||||
"label": "label"
|
||||
},
|
||||
"remoteFunc": "",
|
||||
"hidden": false,
|
||||
"hiddenOnAdd": false,
|
||||
"fieldNote": "",
|
||||
"autoWidth": 50
|
||||
},
|
||||
"advancedSetting": {
|
||||
"defaultValue": {
|
||||
"type": "compose",
|
||||
"value": "",
|
||||
"format": "string",
|
||||
"allowFunc": true,
|
||||
"valueSplit": ",",
|
||||
"customConfig": true
|
||||
}
|
||||
},
|
||||
"remoteAPI": {
|
||||
"url": "",
|
||||
"executed": false
|
||||
},
|
||||
"key": "1717072991431_622198",
|
||||
"model": "select_1717072991431_622198",
|
||||
"modelType": "main",
|
||||
"rules": [],
|
||||
"isSubItem": false
|
||||
}
|
||||
],
|
||||
"options": {
|
||||
"required": false,
|
||||
"hiddenOnAdd": false,
|
||||
"hidden": false,
|
||||
"fieldNote": ""
|
||||
},
|
||||
"model": "card_1717072988159_545097",
|
||||
"hideTitle": false,
|
||||
"modelType": "main"
|
||||
},
|
||||
{
|
||||
"key": "1717072932495_382575",
|
||||
"type": "card",
|
||||
"isAutoGrid": true,
|
||||
"isContainer": true,
|
||||
"list": [
|
||||
{
|
||||
"type": "imgupload",
|
||||
"name": "图片上传",
|
||||
"className": "form-tupian",
|
||||
"icon": "icon-tupian",
|
||||
"hideTitle": false,
|
||||
"options": {
|
||||
"defaultValue": [],
|
||||
"size": {
|
||||
"width": 100,
|
||||
"height": 100
|
||||
},
|
||||
"width": "",
|
||||
"tokenFunc": "funcGetToken",
|
||||
"token": "",
|
||||
"domain": "http://img.h5huodong.com",
|
||||
"disabled": false,
|
||||
"length": 9,
|
||||
"multiple": true,
|
||||
"hidden": false,
|
||||
"hiddenOnAdd": false,
|
||||
"required": false,
|
||||
"fieldNote": "",
|
||||
"autoWidth": 50
|
||||
},
|
||||
"key": "1717072996509_795340",
|
||||
"model": "imgupload_1717072996509_795340",
|
||||
"modelType": "main",
|
||||
"rules": [],
|
||||
"isSubItem": false
|
||||
},
|
||||
{
|
||||
"type": "file-upload",
|
||||
"name": "附件",
|
||||
"className": "form-file-upload",
|
||||
"icon": "icon-shangchuan",
|
||||
"hideTitle": false,
|
||||
"options": {
|
||||
"defaultValue": [],
|
||||
"token": "",
|
||||
"length": 1,
|
||||
"drag": false,
|
||||
"multiple": false,
|
||||
"disabled": false,
|
||||
"buttonText": "添加附件",
|
||||
"tokenFunc": "funcGetToken",
|
||||
"hidden": false,
|
||||
"hiddenOnAdd": false,
|
||||
"required": false,
|
||||
"fieldNote": "",
|
||||
"autoWidth": 50
|
||||
},
|
||||
"key": "1717072932495_669325",
|
||||
"model": "file_upload_1717072932495_669325",
|
||||
"modelType": "main",
|
||||
"rules": [],
|
||||
"isSubItem": false
|
||||
}
|
||||
],
|
||||
"options": {
|
||||
"required": false,
|
||||
"hiddenOnAdd": false,
|
||||
"hidden": false,
|
||||
"fieldNote": ""
|
||||
},
|
||||
"model": "card_1717072932495_382575",
|
||||
"hideTitle": false,
|
||||
"modelType": "main"
|
||||
}
|
||||
],
|
||||
"config": {
|
||||
"titleField": "input_1717072932495_556479",
|
||||
"showHeaderTitle": true,
|
||||
"labelWidth": 100,
|
||||
"labelPosition": "top",
|
||||
"size": "small",
|
||||
"dialogOptions": {
|
||||
"top": 20,
|
||||
"width": 1000,
|
||||
"padding": {
|
||||
"top": 25,
|
||||
"right": 25,
|
||||
"bottom": 30,
|
||||
"left": 25
|
||||
}
|
||||
},
|
||||
"disabledAutoGrid": false,
|
||||
"designMobileView": false,
|
||||
"enableComment": true,
|
||||
"hasWidgets": [
|
||||
"input",
|
||||
"number",
|
||||
"card",
|
||||
"money",
|
||||
"select",
|
||||
"imgupload",
|
||||
"file-upload"
|
||||
],
|
||||
"expand": {
|
||||
"js": "",
|
||||
"css": "",
|
||||
"url": {
|
||||
"js": "",
|
||||
"css": ""
|
||||
}
|
||||
},
|
||||
"transactional": true,
|
||||
"customRequestURL": [
|
||||
{
|
||||
"url": ""
|
||||
}
|
||||
],
|
||||
"allowExternalLink": false,
|
||||
"externalLinkShowData": false,
|
||||
"headerImgUrl": "",
|
||||
"externalTitle": "",
|
||||
"enableNotice": false,
|
||||
"noticeMode": "external",
|
||||
"noticeType": "system",
|
||||
"noticeReceiver": "",
|
||||
"allowPrint": false,
|
||||
"allowJmReport": false,
|
||||
"jmReportURL": "",
|
||||
"bizRuleConfig": [],
|
||||
"bigDataMode": false
|
||||
}
|
||||
}
|
||||
@ -1,496 +0,0 @@
|
||||
{
|
||||
"list": [
|
||||
{
|
||||
"hideTitle": false,
|
||||
"options": {
|
||||
"hidden": false,
|
||||
"hiddenOnAdd": false,
|
||||
"fieldNote": "",
|
||||
"required": false
|
||||
},
|
||||
"isContainer": true,
|
||||
"model": "card_1717072902303_783177",
|
||||
"modelType": "main",
|
||||
"type": "card",
|
||||
"isAutoGrid": true,
|
||||
"list": [
|
||||
{
|
||||
"isSubItem": false,
|
||||
"remoteAPI": {
|
||||
"executed": false,
|
||||
"url": ""
|
||||
},
|
||||
"icon": "icon-input",
|
||||
"className": "form-input",
|
||||
"rules": [
|
||||
{
|
||||
"required": true,
|
||||
"message": "${title}必须填写"
|
||||
}
|
||||
],
|
||||
"modelType": "main",
|
||||
"type": "input",
|
||||
"hideTitle": false,
|
||||
"name": "名称",
|
||||
"options": {
|
||||
"clearable": false,
|
||||
"hidden": false,
|
||||
"defaultValue": "",
|
||||
"pattern": "",
|
||||
"fillRuleCode": "",
|
||||
"fieldNote": "",
|
||||
"required": true,
|
||||
"readonly": false,
|
||||
"unique": false,
|
||||
"hiddenOnAdd": false,
|
||||
"width": "100%",
|
||||
"autoWidth": 100,
|
||||
"showPassword": false,
|
||||
"disabled": false,
|
||||
"placeholder": ""
|
||||
},
|
||||
"model": "input_1717072902303_477529",
|
||||
"advancedSetting": {
|
||||
"defaultValue": {
|
||||
"type": "compose",
|
||||
"value": "",
|
||||
"format": "string",
|
||||
"allowFunc": true,
|
||||
"valueSplit": "",
|
||||
"customConfig": false
|
||||
}
|
||||
},
|
||||
"key": "1717072902303_477529"
|
||||
}
|
||||
],
|
||||
"key": "1717072902303_783177"
|
||||
},
|
||||
{
|
||||
"options": {
|
||||
"required": false,
|
||||
"hiddenOnAdd": false,
|
||||
"hidden": false,
|
||||
"fieldNote": ""
|
||||
},
|
||||
"isContainer": true,
|
||||
"model": "card_1717073019436_526262",
|
||||
"type": "card",
|
||||
"isAutoGrid": true,
|
||||
"list": [
|
||||
{
|
||||
"isSubItem": false,
|
||||
"remoteAPI": {
|
||||
"executed": false,
|
||||
"url": ""
|
||||
},
|
||||
"icon": "icon-number",
|
||||
"className": "form-number",
|
||||
"rules": [],
|
||||
"modelType": "main",
|
||||
"type": "number",
|
||||
"hideTitle": false,
|
||||
"name": "数字",
|
||||
"options": {
|
||||
"controls": false,
|
||||
"showPercent": false,
|
||||
"hidden": false,
|
||||
"max": 100,
|
||||
"defaultValue": 0,
|
||||
"unitPosition": "suffix",
|
||||
"fieldNote": "",
|
||||
"maxUnlimited": true,
|
||||
"align": "left",
|
||||
"required": false,
|
||||
"min": 0,
|
||||
"minUnlimited": true,
|
||||
"hiddenOnAdd": false,
|
||||
"width": "",
|
||||
"autoWidth": 50,
|
||||
"step": 1,
|
||||
"disabled": false,
|
||||
"placeholder": "",
|
||||
"controlsPosition": "right",
|
||||
"unitText": ""
|
||||
},
|
||||
"model": "number_1717073019436_586474",
|
||||
"advancedSetting": {
|
||||
"defaultValue": {
|
||||
"type": "compose",
|
||||
"value": "",
|
||||
"format": "number",
|
||||
"allowFunc": true,
|
||||
"valueSplit": "",
|
||||
"customConfig": false
|
||||
}
|
||||
},
|
||||
"key": "1717073019436_586474"
|
||||
},
|
||||
{
|
||||
"isSubItem": false,
|
||||
"remoteAPI": {
|
||||
"executed": false,
|
||||
"url": ""
|
||||
},
|
||||
"icon": "icon-money",
|
||||
"className": "form-money",
|
||||
"rules": [],
|
||||
"modelType": "main",
|
||||
"type": "money",
|
||||
"hideTitle": false,
|
||||
"name": "金额",
|
||||
"options": {
|
||||
"hidden": false,
|
||||
"precision": 2,
|
||||
"hiddenOnAdd": false,
|
||||
"width": "180px",
|
||||
"autoWidth": 50,
|
||||
"unitPosition": "suffix",
|
||||
"disabled": false,
|
||||
"fieldNote": "",
|
||||
"placeholder": "请输入金额",
|
||||
"required": false,
|
||||
"unitText": "元"
|
||||
},
|
||||
"model": "money_1717073021100_526660",
|
||||
"advancedSetting": {
|
||||
"defaultValue": {
|
||||
"type": "compose",
|
||||
"value": "",
|
||||
"format": "number",
|
||||
"allowFunc": true,
|
||||
"valueSplit": "",
|
||||
"customConfig": false
|
||||
}
|
||||
},
|
||||
"key": "1717073021100_526660"
|
||||
}
|
||||
],
|
||||
"key": "1717073019436_526262",
|
||||
"hideTitle": false,
|
||||
"modelType": "main"
|
||||
},
|
||||
{
|
||||
"hideTitle": false,
|
||||
"options": {
|
||||
"hidden": false,
|
||||
"hiddenOnAdd": false,
|
||||
"fieldNote": "",
|
||||
"required": false
|
||||
},
|
||||
"isContainer": true,
|
||||
"model": "card_1717072902303_118977",
|
||||
"modelType": "main",
|
||||
"type": "card",
|
||||
"isAutoGrid": true,
|
||||
"list": [
|
||||
{
|
||||
"isSubItem": false,
|
||||
"remoteAPI": {
|
||||
"executed": false,
|
||||
"url": ""
|
||||
},
|
||||
"icon": "icon-select",
|
||||
"className": "form-select",
|
||||
"rules": [],
|
||||
"modelType": "main",
|
||||
"type": "select",
|
||||
"hideTitle": false,
|
||||
"name": "下拉选择框",
|
||||
"options": {
|
||||
"remoteFunc": "",
|
||||
"filterable": false,
|
||||
"clearable": true,
|
||||
"hidden": false,
|
||||
"defaultValue": "",
|
||||
"remoteOptions": [],
|
||||
"multiple": false,
|
||||
"fieldNote": "",
|
||||
"remote": false,
|
||||
"required": false,
|
||||
"showLabel": false,
|
||||
"useColor": false,
|
||||
"props": {
|
||||
"label": "label",
|
||||
"value": "value"
|
||||
},
|
||||
"colorIteratorIndex": 3,
|
||||
"hiddenOnAdd": false,
|
||||
"width": "",
|
||||
"options": [
|
||||
{
|
||||
"itemColor": "#2196F3",
|
||||
"value": "下拉框1"
|
||||
},
|
||||
{
|
||||
"itemColor": "#08C9C9",
|
||||
"value": "下拉框2"
|
||||
},
|
||||
{
|
||||
"itemColor": "#00C345",
|
||||
"value": "下拉框3"
|
||||
}
|
||||
],
|
||||
"autoWidth": 50,
|
||||
"showType": "default",
|
||||
"disabled": false,
|
||||
"placeholder": ""
|
||||
},
|
||||
"model": "select_1717073033259_273399",
|
||||
"advancedSetting": {
|
||||
"defaultValue": {
|
||||
"type": "compose",
|
||||
"value": "",
|
||||
"format": "string",
|
||||
"allowFunc": true,
|
||||
"valueSplit": ",",
|
||||
"customConfig": true
|
||||
}
|
||||
},
|
||||
"key": "1717073033259_273399"
|
||||
},
|
||||
{
|
||||
"isSubItem": false,
|
||||
"remoteAPI": {
|
||||
"executed": false,
|
||||
"url": ""
|
||||
},
|
||||
"icon": "icon-textarea",
|
||||
"className": "form-textarea",
|
||||
"rules": [],
|
||||
"modelType": "main",
|
||||
"type": "textarea",
|
||||
"hideTitle": false,
|
||||
"name": "描述",
|
||||
"options": {
|
||||
"readonly": false,
|
||||
"hidden": false,
|
||||
"defaultValue": "",
|
||||
"unique": false,
|
||||
"hiddenOnAdd": false,
|
||||
"width": "100%",
|
||||
"pattern": "",
|
||||
"autoWidth": 50,
|
||||
"disabled": false,
|
||||
"fieldNote": "",
|
||||
"placeholder": "",
|
||||
"required": false
|
||||
},
|
||||
"model": "textarea_1717072902303_129466",
|
||||
"advancedSetting": {
|
||||
"defaultValue": {
|
||||
"type": "compose",
|
||||
"value": "",
|
||||
"format": "string",
|
||||
"allowFunc": true,
|
||||
"valueSplit": "",
|
||||
"customConfig": false
|
||||
}
|
||||
},
|
||||
"key": "1717072902303_129466"
|
||||
}
|
||||
],
|
||||
"key": "1717072902303_118977"
|
||||
},
|
||||
{
|
||||
"hideTitle": false,
|
||||
"options": {
|
||||
"hidden": false,
|
||||
"hiddenOnAdd": false,
|
||||
"fieldNote": "",
|
||||
"required": false
|
||||
},
|
||||
"isContainer": true,
|
||||
"model": "card_1717072902304_736053",
|
||||
"modelType": "main",
|
||||
"type": "card",
|
||||
"isAutoGrid": true,
|
||||
"list": [
|
||||
{
|
||||
"hideTitle": false,
|
||||
"isSubItem": false,
|
||||
"name": "图片上传",
|
||||
"icon": "icon-tupian",
|
||||
"options": {
|
||||
"hidden": false,
|
||||
"defaultValue": [],
|
||||
"length": 9,
|
||||
"multiple": true,
|
||||
"fieldNote": "",
|
||||
"required": false,
|
||||
"token": "",
|
||||
"size": {
|
||||
"width": 100,
|
||||
"height": 100
|
||||
},
|
||||
"tokenFunc": "funcGetToken",
|
||||
"domain": "http://img.h5huodong.com",
|
||||
"hiddenOnAdd": false,
|
||||
"width": "",
|
||||
"autoWidth": 50,
|
||||
"disabled": false
|
||||
},
|
||||
"className": "form-tupian",
|
||||
"model": "imgupload_1717073025137_563739",
|
||||
"rules": [],
|
||||
"modelType": "main",
|
||||
"type": "imgupload",
|
||||
"key": "1717073025137_563739"
|
||||
},
|
||||
{
|
||||
"hideTitle": false,
|
||||
"isSubItem": false,
|
||||
"name": "附件",
|
||||
"icon": "icon-shangchuan",
|
||||
"options": {
|
||||
"buttonText": "添加附件",
|
||||
"hidden": false,
|
||||
"defaultValue": [],
|
||||
"length": 1,
|
||||
"multiple": false,
|
||||
"fieldNote": "",
|
||||
"required": false,
|
||||
"token": "",
|
||||
"tokenFunc": "funcGetToken",
|
||||
"hiddenOnAdd": false,
|
||||
"autoWidth": 50,
|
||||
"disabled": false,
|
||||
"drag": false
|
||||
},
|
||||
"className": "form-file-upload",
|
||||
"model": "file_upload_1717072902304_442777",
|
||||
"rules": [],
|
||||
"modelType": "main",
|
||||
"type": "file-upload",
|
||||
"key": "1717072902304_442777"
|
||||
}
|
||||
],
|
||||
"key": "1717072902304_736053"
|
||||
},
|
||||
{
|
||||
"isSubItem": false,
|
||||
"remoteAPI": {
|
||||
"url": "",
|
||||
"executed": false
|
||||
},
|
||||
"icon": "icon-link",
|
||||
"className": "form-link-record",
|
||||
"rules": [],
|
||||
"modelType": "main",
|
||||
"type": "link-record",
|
||||
"hideTitle": false,
|
||||
"name": "主表@表单控件",
|
||||
"options": {
|
||||
"sourceCode": "ai_control_main",
|
||||
"showMode": "single",
|
||||
"showType": "card",
|
||||
"titleField": "wen_ben",
|
||||
"showFields": [],
|
||||
"allowView": true,
|
||||
"allowEdit": true,
|
||||
"allowAdd": true,
|
||||
"allowSelect": true,
|
||||
"buttonText": "添加记录",
|
||||
"twoWayModel": "sub_table_design_1717137038626_791984",
|
||||
"dataSelectAuth": "all",
|
||||
"filters": [
|
||||
{
|
||||
"matchType": "AND",
|
||||
"rules": []
|
||||
}
|
||||
],
|
||||
"search": {
|
||||
"enabled": false,
|
||||
"field": "",
|
||||
"rule": "like",
|
||||
"afterShow": false,
|
||||
"fields": []
|
||||
},
|
||||
"createMode": {
|
||||
"add": true,
|
||||
"select": false,
|
||||
"params": {
|
||||
"selectLinkModel": ""
|
||||
}
|
||||
},
|
||||
"width": "100%",
|
||||
"defaultValue": "",
|
||||
"defaultValType": "none",
|
||||
"required": false,
|
||||
"disabled": false,
|
||||
"hidden": false,
|
||||
"hiddenOnAdd": false,
|
||||
"fieldNote": ""
|
||||
},
|
||||
"model": "link_record_1717137044235_306956",
|
||||
"advancedSetting": {
|
||||
"defaultValue": {
|
||||
"type": "compose",
|
||||
"value": "",
|
||||
"format": "string",
|
||||
"allowFunc": true,
|
||||
"valueSplit": "",
|
||||
"customConfig": true
|
||||
}
|
||||
},
|
||||
"key": "1717137044235_306956"
|
||||
}
|
||||
],
|
||||
"config": {
|
||||
"jmReportURL": "",
|
||||
"enableComment": true,
|
||||
"dialogOptions": {
|
||||
"padding": {
|
||||
"top": 25,
|
||||
"left": 25,
|
||||
"bottom": 30,
|
||||
"right": 25
|
||||
},
|
||||
"top": 20,
|
||||
"width": 1000
|
||||
},
|
||||
"allowJmReport": false,
|
||||
"labelWidth": 100,
|
||||
"headerImgUrl": "",
|
||||
"noticeMode": "external",
|
||||
"noticeReceiver": "",
|
||||
"designMobileView": false,
|
||||
"labelPosition": "top",
|
||||
"allowPrint": false,
|
||||
"enableNotice": false,
|
||||
"bizRuleConfig": [],
|
||||
"showHeaderTitle": true,
|
||||
"bigDataMode": false,
|
||||
"titleField": "input_1717072902303_477529",
|
||||
"externalTitle": "",
|
||||
"noticeType": "system",
|
||||
"customRequestURL": [
|
||||
{
|
||||
"url": ""
|
||||
}
|
||||
],
|
||||
"hasWidgets": [
|
||||
"input",
|
||||
"card",
|
||||
"number",
|
||||
"money",
|
||||
"select",
|
||||
"textarea",
|
||||
"imgupload",
|
||||
"file-upload",
|
||||
"link-record"
|
||||
],
|
||||
"expand": {
|
||||
"css": "",
|
||||
"js": "",
|
||||
"url": {
|
||||
"css": "",
|
||||
"js": ""
|
||||
}
|
||||
},
|
||||
"size": "small",
|
||||
"disabledAutoGrid": false,
|
||||
"allowExternalLink": false,
|
||||
"externalLinkShowData": false,
|
||||
"transactional": true
|
||||
}
|
||||
}
|
||||