diff --git a/jnpf-java-boot/jnpf-scm/jnpf-scm-biz/pom.xml b/jnpf-java-boot/jnpf-scm/jnpf-scm-biz/pom.xml
index d6475ee..4ef16c8 100644
--- a/jnpf-java-boot/jnpf-scm/jnpf-scm-biz/pom.xml
+++ b/jnpf-java-boot/jnpf-scm/jnpf-scm-biz/pom.xml
@@ -17,4 +17,85 @@
UTF-8
+
+
+ com.jnpf
+ jnpf-scm-entity
+ ${project.version}
+
+
+ com.jnpf
+ jnpf-generater-base
+ ${project.version}
+
+
+ com.jnpf
+ jnpf-common-all
+ ${project.version}
+
+
+ com.jnpf
+ jnpf-file-controller
+ 3.5.0-RELEASE
+ compile
+
+
+ com.itextpdf
+ itextpdf
+
+
+
+ org.freemarker
+ freemarker
+ 2.3.27-incubating
+
+
+
+ e-iceblue
+ spire.doc.free
+ 5.2.0
+
+
+
+ org.xhtmlrenderer
+ flying-saucer-pdf
+ 9.0.7
+
+
+
+ com.itextpdf
+ itextpdf
+ 5.5.13.3
+
+
+ com.itextpdf
+ itext-asian
+ 5.2.0
+
+
+
+ com.jnpf
+ jnpf-workflow-engine-controller
+ 3.5.0-RELEASE
+ compile
+
+
+ com.jnpf
+ jnpf-workflow-engine-controller
+ 3.5.0-RELEASE
+ compile
+
+
+ com.jnpf
+ jnpf-workflow-engine-controller
+ 3.5.0-RELEASE
+ compile
+
+
+ com.jnpf
+ jnpf-workflow-engine-controller
+ 3.5.0-RELEASE
+ compile
+
+
\ No newline at end of file
diff --git a/jnpf-java-boot/jnpf-scm/jnpf-scm-biz/src/main/java/jnpf/mapper/ParkMapper.java b/jnpf-java-boot/jnpf-scm/jnpf-scm-biz/src/main/java/jnpf/mapper/ParkMapper.java
new file mode 100644
index 0000000..11d5f82
--- /dev/null
+++ b/jnpf-java-boot/jnpf-scm/jnpf-scm-biz/src/main/java/jnpf/mapper/ParkMapper.java
@@ -0,0 +1,16 @@
+package jnpf.mapper;
+
+
+import jnpf.entity.ParkEntity;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * park
+ * 版本: V3.5
+ * 版权: 引迈信息技术有限公司(https://www.jnpfsoft.com)
+ * 作者: JNPF开发平台组
+ * 日期: 2024-07-12
+ */
+public interface ParkMapper extends BaseMapper {
+
+}
diff --git a/jnpf-java-boot/jnpf-scm/jnpf-scm-biz/src/main/java/jnpf/service/ParkService.java b/jnpf-java-boot/jnpf-scm/jnpf-scm-biz/src/main/java/jnpf/service/ParkService.java
new file mode 100644
index 0000000..3c0b1fd
--- /dev/null
+++ b/jnpf-java-boot/jnpf-scm/jnpf-scm-biz/src/main/java/jnpf/service/ParkService.java
@@ -0,0 +1,35 @@
+package jnpf.service;
+
+import jnpf.model.park.*;
+import jnpf.entity.*;
+import java.util.*;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+
+/**
+ * park
+ * 版本: V3.5
+ * 版权: 引迈信息技术有限公司(https://www.jnpfsoft.com)
+ * 作者: JNPF开发平台组
+ * 日期: 2024-07-12
+ */
+public interface ParkService extends IService {
+ List getList(ParkPagination parkPagination);
+
+ List getTypeList(ParkPagination parkPagination,String dataType);
+
+ ParkEntity getInfo(String id);
+
+ void delete(ParkEntity entity);
+
+ void create(ParkEntity entity);
+
+ boolean update(String id, ParkEntity entity);
+
+ //子表方法
+ //副表数据方法
+ String checkForm(ParkForm form,int i);
+
+ void saveOrUpdate(ParkForm parkForm,String id, boolean isSave) throws Exception;
+
+}
diff --git a/jnpf-java-boot/jnpf-scm/jnpf-scm-biz/src/main/java/jnpf/service/impl/ParkServiceImpl.java b/jnpf-java-boot/jnpf-scm/jnpf-scm-biz/src/main/java/jnpf/service/impl/ParkServiceImpl.java
new file mode 100644
index 0000000..b68c007
--- /dev/null
+++ b/jnpf-java-boot/jnpf-scm/jnpf-scm-biz/src/main/java/jnpf/service/impl/ParkServiceImpl.java
@@ -0,0 +1,289 @@
+package jnpf.service.impl;
+
+import jnpf.entity.*;
+import jnpf.mapper.ParkMapper;
+import jnpf.service.*;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import jnpf.model.park.*;
+import java.math.BigDecimal;
+import cn.hutool.core.util.ObjectUtil;
+import jnpf.permission.model.authorize.AuthorizeConditionModel;
+import jnpf.util.GeneraterSwapUtil;
+import jnpf.database.model.superQuery.SuperQueryJsonModel;
+import jnpf.database.model.superQuery.ConditionJsonModel;
+import jnpf.database.model.superQuery.SuperQueryConditionModel;
+import java.lang.reflect.Field;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.util.regex.Pattern;
+import jnpf.model.QueryModel;
+import java.util.stream.Collectors;
+import jnpf.base.model.ColumnDataModel;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import jnpf.database.model.superQuery.SuperJsonModel;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import java.text.SimpleDateFormat;
+import jnpf.util.*;
+import java.util.*;
+import jnpf.base.UserInfo;
+import jnpf.permission.entity.UserEntity;
+/**
+ *
+ * park
+ * 版本: V3.5
+ * 版权: 引迈信息技术有限公司(https://www.jnpfsoft.com)
+ * 作者: JNPF开发平台组
+ * 日期: 2024-07-12
+ */
+@Service
+public class ParkServiceImpl extends ServiceImpl implements ParkService{
+ @Autowired
+ private GeneraterSwapUtil generaterSwapUtil;
+
+ @Autowired
+ private UserProvider userProvider;
+
+ @Override
+ public List getList(ParkPagination parkPagination){
+ return getTypeList(parkPagination,parkPagination.getDataType());
+ }
+ /** 列表查询 */
+ @Override
+ public List getTypeList(ParkPagination parkPagination,String dataType){
+ String userId=userProvider.get().getUserId();
+ List AllIdList =new ArrayList();
+ List> intersectionList =new ArrayList<>();
+ boolean isPc = ServletUtil.getHeader("jnpf-origin").equals("pc");
+ String columnData = !isPc ? ParkConstant.getAppColumnData() : ParkConstant.getColumnData();
+ ColumnDataModel columnDataModel = JsonUtil.getJsonToBean(columnData, ColumnDataModel.class);
+ String ruleJson = !isPc ? JsonUtil.getObjectToString(columnDataModel.getRuleListApp()) : JsonUtil.getObjectToString(columnDataModel.getRuleList());
+
+ int total=0;
+ int parkNum =0;
+ QueryWrapper parkQueryWrapper=new QueryWrapper<>();
+ List allSuperIDlist = new ArrayList<>();
+ String superOp ="";
+ if (ObjectUtil.isNotEmpty(parkPagination.getSuperQueryJson())){
+ List allSuperList = new ArrayList<>();
+ List> intersectionSuperList = new ArrayList<>();
+ String queryJson = parkPagination.getSuperQueryJson();
+ SuperJsonModel superJsonModel = JsonUtil.getJsonToBean(queryJson, SuperJsonModel.class);
+ int superNum = 0;
+ QueryWrapper parkSuperWrapper = new QueryWrapper<>();
+ parkSuperWrapper = generaterSwapUtil.getCondition(new QueryModel(parkSuperWrapper,ParkEntity.class,queryJson,"0"));
+ int parkNum1 = parkSuperWrapper.getExpression().getNormal().size();
+ if (parkNum1>0){
+ List parkList =this.list(parkSuperWrapper).stream().map(ParkEntity::getId).collect(Collectors.toList());
+ allSuperList.addAll(parkList);
+ intersectionSuperList.add(parkList);
+ superNum++;
+ }
+ superOp = superNum > 0 ? superJsonModel.getMatchLogic() : "";
+ //and or
+ if(superOp.equalsIgnoreCase("and")){
+ allSuperIDlist = generaterSwapUtil.getIntersection(intersectionSuperList);
+ }else{
+ allSuperIDlist = allSuperList;
+ }
+ }
+ List allRuleIDlist = new ArrayList<>();
+ String ruleOp ="";
+ if (ObjectUtil.isNotEmpty(ruleJson)){
+ List allRuleList = new ArrayList<>();
+ List> intersectionRuleList = new ArrayList<>();
+ SuperJsonModel ruleJsonModel = JsonUtil.getJsonToBean(ruleJson, SuperJsonModel.class);
+ int ruleNum = 0;
+ QueryWrapper parkSuperWrapper = new QueryWrapper<>();
+ parkSuperWrapper = generaterSwapUtil.getCondition(new QueryModel(parkSuperWrapper,ParkEntity.class,ruleJson,"0"));
+ int parkNum1 = parkSuperWrapper.getExpression().getNormal().size();
+ if (parkNum1>0){
+ List parkList =this.list(parkSuperWrapper).stream().map(ParkEntity::getId).collect(Collectors.toList());
+ allRuleList.addAll(parkList);
+ intersectionRuleList.add(parkList);
+ ruleNum++;
+ }
+ ruleOp = ruleNum > 0 ? ruleJsonModel.getMatchLogic() : "";
+ //and or
+ if(ruleOp.equalsIgnoreCase("and")){
+ allRuleIDlist = generaterSwapUtil.getIntersection(intersectionRuleList);
+ }else{
+ allRuleIDlist = allRuleList;
+ }
+ }
+ boolean pcPermission = false;
+ boolean appPermission = false;
+ if(isPc && pcPermission){
+ if (!userProvider.get().getIsAdministrator()){
+ Object parkObj=generaterSwapUtil.getAuthorizeCondition(new QueryModel(parkQueryWrapper,ParkEntity.class,parkPagination.getMenuId(),"0"));
+ if (ObjectUtil.isEmpty(parkObj)){
+ return new ArrayList<>();
+ } else {
+ parkQueryWrapper = (QueryWrapper)parkObj;
+ if( parkQueryWrapper.getExpression().getNormal().size()>0){
+ parkNum++;
+ }
+ }
+ }
+ }
+ if(!isPc && appPermission){
+ if (!userProvider.get().getIsAdministrator()){
+ Object parkObj=generaterSwapUtil.getAuthorizeCondition(new QueryModel(parkQueryWrapper,ParkEntity.class,parkPagination.getMenuId(),"0"));
+ if (ObjectUtil.isEmpty(parkObj)){
+ return new ArrayList<>();
+ } else {
+ parkQueryWrapper = (QueryWrapper)parkObj;
+ if( parkQueryWrapper.getExpression().getNormal().size()>0){
+ parkNum++;
+ }
+ }
+
+
+ }
+ }
+ if(isPc){
+ if(ObjectUtil.isNotEmpty(parkPagination.getParkName())){
+ parkNum++;
+
+ String value = parkPagination.getParkName() instanceof List ?
+ JsonUtil.getObjectToString(parkPagination.getParkName()) :
+ String.valueOf(parkPagination.getParkName());
+ parkQueryWrapper.lambda().like(ParkEntity::getParkName,value);
+
+ }
+
+ }
+ List intersection = generaterSwapUtil.getIntersection(intersectionList);
+ if (total>0){
+ if (intersection.size()==0){
+ intersection.add("jnpfNullList");
+ }
+ parkQueryWrapper.lambda().in(ParkEntity::getId, intersection);
+ }
+ //是否有高级查询
+ if (StringUtil.isNotEmpty(superOp)){
+ if (allSuperIDlist.size()==0){
+ allSuperIDlist.add("jnpfNullList");
+ }
+ List finalAllSuperIDlist = allSuperIDlist;
+ parkQueryWrapper.lambda().and(t->t.in(ParkEntity::getId, finalAllSuperIDlist));
+ }
+ //是否有数据过滤查询
+ if (StringUtil.isNotEmpty(ruleOp)){
+ if (allRuleIDlist.size()==0){
+ allRuleIDlist.add("jnpfNullList");
+ }
+ List finalAllRuleIDlist = allRuleIDlist;
+ parkQueryWrapper.lambda().and(t->t.in(ParkEntity::getId, finalAllRuleIDlist));
+ }
+ //假删除标志
+ parkQueryWrapper.lambda().isNull(ParkEntity::getDeleteMark);
+
+ //排序
+ if(StringUtil.isEmpty(parkPagination.getSidx())){
+ parkQueryWrapper.lambda().orderByDesc(ParkEntity::getId);
+ }else{
+ try {
+ String sidx = parkPagination.getSidx();
+ String[] strs= sidx.split("_name");
+ ParkEntity parkEntity = new ParkEntity();
+ Field declaredField = parkEntity.getClass().getDeclaredField(strs[0]);
+ declaredField.setAccessible(true);
+ String value = declaredField.getAnnotation(TableField.class).value();
+ parkQueryWrapper="asc".equals(parkPagination.getSort().toLowerCase())?parkQueryWrapper.orderByAsc(value):parkQueryWrapper.orderByDesc(value);
+ } catch (NoSuchFieldException e) {
+ e.printStackTrace();
+ }
+ }
+
+ if("0".equals(dataType)){
+ if((total>0 && AllIdList.size()>0) || total==0){
+ Page page=new Page<>(parkPagination.getCurrentPage(), parkPagination.getPageSize());
+ IPage userIPage=this.page(page, parkQueryWrapper);
+ return parkPagination.setData(userIPage.getRecords(),userIPage.getTotal());
+ }else{
+ List list = new ArrayList();
+ return parkPagination.setData(list, list.size());
+ }
+ }else{
+ return this.list(parkQueryWrapper);
+ }
+ }
+ @Override
+ public ParkEntity getInfo(String id){
+ QueryWrapper queryWrapper=new QueryWrapper<>();
+ queryWrapper.lambda().eq(ParkEntity::getId,id);
+ return this.getOne(queryWrapper);
+ }
+ @Override
+ public void create(ParkEntity entity){
+ this.save(entity);
+ }
+ @Override
+ public boolean update(String id, ParkEntity entity){
+ return this.updateById(entity);
+ }
+ @Override
+ public void delete(ParkEntity entity){
+ if(entity!=null){
+ this.removeById(entity.getId());
+ }
+ }
+ /** 验证表单唯一字段,正则,非空 i-0新增-1修改*/
+ @Override
+ public String checkForm(ParkForm form,int i) {
+ boolean isUp =StringUtil.isNotEmpty(form.getId()) && !form.getId().equals("0");
+ String id="";
+ String countRecover = "";
+ if (isUp){
+ id = form.getId();
+ }
+ //主表字段验证
+ if(StringUtil.isEmpty(form.getParkNumber())){
+ return "园区编码不能为空";
+ }
+ if(StringUtil.isNotEmpty(form.getParkNumber())){
+ form.setParkNumber(form.getParkNumber().trim());
+ QueryWrapper parkNumberWrapper=new QueryWrapper<>();
+ parkNumberWrapper.lambda().eq(ParkEntity::getParkNumber,form.getParkNumber());
+ //假删除标志
+ parkNumberWrapper.lambda().isNull(ParkEntity::getDeleteMark);
+ if (isUp){
+ parkNumberWrapper.lambda().ne(ParkEntity::getId, id);
+ }
+ if((int) this.count(parkNumberWrapper)>0){
+ countRecover = "园区编码不能重复";
+ }
+ }
+ if(StringUtil.isEmpty(form.getParkName())){
+ return "园区名称不能为空";
+ }
+ return countRecover;
+ }
+ /**
+ * 新增修改数据(事务回滚)
+ * @param id
+ * @param parkForm
+ * @return
+ */
+ @Override
+ @Transactional
+ public void saveOrUpdate(ParkForm parkForm,String id, boolean isSave) throws Exception{
+ UserInfo userInfo=userProvider.get();
+ UserEntity userEntity = generaterSwapUtil.getUser(userInfo.getUserId());
+ parkForm = JsonUtil.getJsonToBean(
+ generaterSwapUtil.swapDatetime(ParkConstant.getFormData(),parkForm),ParkForm.class);
+ ParkEntity entity = JsonUtil.getJsonToBean(parkForm, ParkEntity.class);
+
+ if(isSave){
+ String mainId = RandomUtil.uuId() ;
+ entity.setId(mainId);
+ entity.setVersion(0);
+ }else{
+ }
+ this.saveOrUpdate(entity);
+
+ }
+}
diff --git a/jnpf-java-boot/jnpf-scm/jnpf-scm-controller/pom.xml b/jnpf-java-boot/jnpf-scm/jnpf-scm-controller/pom.xml
index 1f04cad..2c83de8 100644
--- a/jnpf-java-boot/jnpf-scm/jnpf-scm-controller/pom.xml
+++ b/jnpf-java-boot/jnpf-scm/jnpf-scm-controller/pom.xml
@@ -16,5 +16,34 @@
8
UTF-8
-
+
+
+ com.jnpf
+ jnpf-scm-biz
+ ${project.version}
+
+
+ com.jnpf
+ jnpf-common-all
+ ${project.version}
+
+
+ com.jnpf
+ jnpf-file-entity
+ 3.5.0-RELEASE
+ compile
+
+
+ com.jnpf
+ jnpf-file-entity
+ 3.5.0-RELEASE
+ compile
+
+
+ com.jnpf
+ jnpf-file-biz
+ 3.5.0-RELEASE
+ compile
+
+
\ No newline at end of file
diff --git a/jnpf-java-boot/jnpf-scm/jnpf-scm-controller/src/main/java/jnpf/controller/ParkController.java b/jnpf-java-boot/jnpf-scm/jnpf-scm-controller/src/main/java/jnpf/controller/ParkController.java
new file mode 100644
index 0000000..6547491
--- /dev/null
+++ b/jnpf-java-boot/jnpf-scm/jnpf-scm-controller/src/main/java/jnpf/controller/ParkController.java
@@ -0,0 +1,507 @@
+package jnpf.controller;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jnpf.base.ActionResult;
+import jnpf.base.UserInfo;
+import jnpf.exception.DataException;
+import jnpf.permission.entity.UserEntity;
+import jnpf.service.*;
+import jnpf.entity.*;
+import jnpf.util.*;
+import jnpf.model.park.*;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import javax.validation.Valid;
+import java.util.*;
+import jnpf.annotation.JnpfField;
+import jnpf.base.vo.PageListVO;
+import jnpf.base.vo.PaginationVO;
+import jnpf.base.vo.DownloadVO;
+import jnpf.config.ConfigValueUtil;
+import jnpf.base.entity.ProvinceEntity;
+import java.io.IOException;
+import java.util.stream.Collectors;
+import jnpf.engine.entity.FlowTaskEntity;
+import jnpf.exception.WorkFlowException;
+import org.springframework.web.multipart.MultipartFile;
+import cn.afterturn.easypoi.excel.ExcelExportUtil;
+import cn.afterturn.easypoi.excel.ExcelImportUtil;
+import cn.afterturn.easypoi.excel.entity.ExportParams;
+import cn.afterturn.easypoi.excel.entity.ImportParams;
+import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity;
+import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.ss.usermodel.Workbook;
+import java.io.File;
+import jnpf.onlinedev.model.ExcelImFieldModel;
+import jnpf.onlinedev.model.OnlineImport.ImportDataModel;
+import jnpf.onlinedev.model.OnlineImport.ImportFormCheckUniqueModel;
+import jnpf.onlinedev.model.OnlineImport.ExcelImportModel;
+import jnpf.onlinedev.model.OnlineImport.VisualImportModel;
+import cn.xuyanwu.spring.file.storage.FileInfo;
+import lombok.Cleanup;
+import jnpf.model.visualJson.config.HeaderModel;
+import jnpf.base.model.ColumnDataModel;
+import jnpf.base.util.VisualUtils;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * park
+ * @版本: V3.5
+ * @版权: 引迈信息技术有限公司(https://www.jnpfsoft.com)
+ * @作者: JNPF开发平台组
+ * @日期: 2024-07-12
+ */
+@Slf4j
+@RestController
+@Tag(name = "park" , description = "scm")
+@RequestMapping("/api/scm/Park")
+public class ParkController {
+
+ @Autowired
+ private GeneraterSwapUtil generaterSwapUtil;
+
+ @Autowired
+ private UserProvider userProvider;
+
+ @Autowired
+ private ParkService parkService;
+
+
+
+ @Autowired
+ private ConfigValueUtil configValueUtil;
+
+ /**
+ * 列表
+ *
+ * @param parkPagination
+ * @return
+ */
+ @Operation(summary = "获取列表")
+ @PostMapping("/getList")
+ public ActionResult list(@RequestBody ParkPagination parkPagination)throws IOException{
+ List list= parkService.getList(parkPagination);
+ List