diff --git a/module-form/src/main/java/ink/wgink/module/form/controller/app/api/report/FormReportAppController.java b/module-form/src/main/java/ink/wgink/module/form/controller/app/api/report/FormReportAppController.java index 1f3b9832..314cf547 100644 --- a/module-form/src/main/java/ink/wgink/module/form/controller/app/api/report/FormReportAppController.java +++ b/module-form/src/main/java/ink/wgink/module/form/controller/app/api/report/FormReportAppController.java @@ -37,6 +37,13 @@ public class FormReportAppController extends DefaultBaseController { return new SuccessResult(); } + @PostMapping("save-release/code/{formCode}/version/{formVersion}") + public SuccessResult saveRelease(@RequestHeader("userId") String userId, @PathVariable("formCode") String formCode, @PathVariable("formVersion") Integer formVersion, @RequestBody Map params) { + checkParams(params); + formReportService.saveByUserId(userId, formCode, formVersion, params); + return new SuccessResult(); + } + @DeleteMapping("remove/code/{formCode}/version/{formVersion}/uids/{uids}") public SuccessResult remove(@RequestHeader("token") String token, @PathVariable("formCode") String formCode, @PathVariable("formVersion") Integer formVersion, @PathVariable("uids") String uids) { formReportService.remove(formCode, formVersion, Arrays.asList(uids.split("\\_"))); @@ -50,17 +57,35 @@ public class FormReportAppController extends DefaultBaseController { return new SuccessResult(); } + @PutMapping("update-release/code/{formCode}/version/{formVersion}/uid/{uid}") + public SuccessResult updateRelease(@RequestHeader("userId") String userId, @PathVariable("formCode") String formCode, @PathVariable("formVersion") Integer formVersion, @PathVariable("uid") String uid, @RequestBody Map params) { + checkParams(params); + formReportService.updateByCreatorAndModifier(userId, userId, formCode, formVersion, uid, params); + return new SuccessResult(); + } + @GetMapping("get/code/{formCode}/version/{formVersion}/uid/{uid}") public Map get(@RequestHeader("token") String token, @PathVariable("formCode") String formCode, @PathVariable("formVersion") Integer formVersion, @PathVariable("uid") String uid) { return formReportService.get(formCode, formVersion, uid); } + @GetMapping("get-release/code/{formCode}/version/{formVersion}/uid/{uid}") + public Map getRelease(@RequestHeader("userId") String userId, @PathVariable("formCode") String formCode, @PathVariable("formVersion") Integer formVersion, @PathVariable("uid") String uid) { + return formReportService.getByUserId(userId, formCode, formVersion, uid); + } + @GetMapping("list/code/{formCode}/version/{formVersion}") public List> list(@RequestHeader("token") String token, @PathVariable("formCode") String formCode, @PathVariable("formVersion") Integer formVersion) { Map params = requestParams(); return formReportService.list(formCode, formVersion, params); } + @GetMapping("list-release/code/{formCode}/version/{formVersion}") + public List> listRelease(@RequestHeader("userId") String userId, @PathVariable("formCode") String formCode, @PathVariable("formVersion") Integer formVersion) { + Map params = requestParams(); + return formReportService.listByUserId(userId, formCode, formVersion, params); + } + @GetMapping("listpage/code/{formCode}/version/{formVersion}") public SuccessResultList>> listPage(@RequestHeader("token") String token, @PathVariable("formCode") String formCode, @PathVariable("formVersion") Integer formVersion, ListPage page) { Map params = requestParams(); @@ -68,6 +93,13 @@ public class FormReportAppController extends DefaultBaseController { return formReportService.listPage(formCode, formVersion, page); } + @GetMapping("listpage-release/code/{formCode}/version/{formVersion}") + public SuccessResultList>> listPageRelease(@RequestHeader("userId") String userId, @PathVariable("formCode") String formCode, @PathVariable("formVersion") Integer formVersion, ListPage page) { + Map params = requestParams(); + page.setParams(params); + return formReportService.listPageByUserId(userId, formCode, formVersion, page); + } + @GetMapping("list-show-field/code/{formCode}/version/{formVersion}") public List listShowField(@RequestHeader("token") String token, @PathVariable("formCode") String formCode, @PathVariable("formVersion") Integer formVersion) { return formReportService.listShowField(formCode, formVersion); diff --git a/module-form/src/main/java/ink/wgink/module/form/dao/design/IFormDao.java b/module-form/src/main/java/ink/wgink/module/form/dao/design/IFormDao.java index 133fd198..2b0ad62d 100644 --- a/module-form/src/main/java/ink/wgink/module/form/dao/design/IFormDao.java +++ b/module-form/src/main/java/ink/wgink/module/form/dao/design/IFormDao.java @@ -23,6 +23,8 @@ public interface IFormDao extends IInitBaseTable { void deleteDynamicFormField(String alterFieldSQL) throws RemoveException; + Integer countTable(String tableName) throws SearchException; + void save(Map params) throws SaveException; void delete(Map params) throws RemoveException; diff --git a/module-form/src/main/java/ink/wgink/module/form/enums/design/FormTypeEnum.java b/module-form/src/main/java/ink/wgink/module/form/enums/design/FormTypeEnum.java index aee06f99..c6130afe 100644 --- a/module-form/src/main/java/ink/wgink/module/form/enums/design/FormTypeEnum.java +++ b/module-form/src/main/java/ink/wgink/module/form/enums/design/FormTypeEnum.java @@ -9,7 +9,6 @@ package ink.wgink.module.form.enums.design; */ public enum FormTypeEnum { DEFAULT("default", "默认"), - FREE_REPORT("freeReport", "自由上报"), OA("oa", "OA"); private String value; diff --git a/module-form/src/main/java/ink/wgink/module/form/service/design/IFormFieldService.java b/module-form/src/main/java/ink/wgink/module/form/service/design/IFormFieldService.java index 55619e9f..c9a43862 100644 --- a/module-form/src/main/java/ink/wgink/module/form/service/design/IFormFieldService.java +++ b/module-form/src/main/java/ink/wgink/module/form/service/design/IFormFieldService.java @@ -34,6 +34,13 @@ public interface IFormFieldService { */ void delete(List ids); + /** + * 删除 + * + * @param formIds 表单ID + */ + void deleteByFormIds(List formIds); + /** * 修改 * @@ -126,9 +133,10 @@ public interface IFormFieldService { /** * 字段名列表 * - * @param formId 表单ID + * @param formId 表单ID * @param isListShow 列表显示状态 * @return */ List listFieldNameByFormIdAndListShow(String formId, Boolean isListShow); + } diff --git a/module-form/src/main/java/ink/wgink/module/form/service/design/IFormService.java b/module-form/src/main/java/ink/wgink/module/form/service/design/IFormService.java index 5da4e72c..d9784c38 100644 --- a/module-form/src/main/java/ink/wgink/module/form/service/design/IFormService.java +++ b/module-form/src/main/java/ink/wgink/module/form/service/design/IFormService.java @@ -18,7 +18,13 @@ public interface IFormService { */ void createDynamicForm(String createTableSQL); - void deleteTable(String tableName); + /** + * 删除表 + * + * @param tableName + * @param checkExist 判断是否存在 + */ + void deleteTable(String tableName, boolean checkExist); void deleteDynamicForm(String deleteTableSQL); @@ -30,6 +36,8 @@ public interface IFormService { void deleteDynamicFormField(String alterFieldSQL); + Integer countDynamicTable(String tableName); + /** * 新增 * @@ -53,6 +61,7 @@ public interface IFormService { */ void delete(List ids); + /** * 删除 * diff --git a/module-form/src/main/java/ink/wgink/module/form/service/design/impl/FormDesignServiceImpl.java b/module-form/src/main/java/ink/wgink/module/form/service/design/impl/FormDesignServiceImpl.java index bb4edd39..b1fb22f9 100644 --- a/module-form/src/main/java/ink/wgink/module/form/service/design/impl/FormDesignServiceImpl.java +++ b/module-form/src/main/java/ink/wgink/module/form/service/design/impl/FormDesignServiceImpl.java @@ -14,12 +14,14 @@ import ink.wgink.module.form.consts.IFormDesignConst; import ink.wgink.module.form.enums.design.FormFieldTypeEnum; import ink.wgink.module.form.enums.design.FormStatusEnum; import ink.wgink.module.form.enums.design.FormTypeEnum; +import ink.wgink.module.form.pojo.pos.design.FormPO; import ink.wgink.module.form.pojo.vos.design.FormDesignVO; import ink.wgink.module.form.pojo.vos.design.FormFieldVO; import ink.wgink.module.form.pojo.vos.design.FormVO; import ink.wgink.module.form.service.design.IFormDesignService; import ink.wgink.module.form.service.design.IFormFieldService; import ink.wgink.module.form.service.design.IFormService; +import ink.wgink.module.form.service.report.IFormReportService; import ink.wgink.util.HtmlHelper; import ink.wgink.util.date.DateUtil; import org.apache.commons.lang3.StringUtils; @@ -47,6 +49,9 @@ public class FormDesignServiceImpl extends DefaultBaseService implements IFormDe private IFormService formService; @Autowired private IFormFieldService formFieldService; + @Autowired + private IFormReportService formReportService; + private Configuration configuration = new Configuration(Configuration.getVersion()); @PostConstruct @@ -64,12 +69,37 @@ public class FormDesignServiceImpl extends DefaultBaseService implements IFormDe String formCode = formDesignVO.getFormCode(); Integer version = 1; + String formId = null; + boolean createNewTable = true; // 时间戳表单编码 if (StringUtils.isBlank(formCode)) { formCode = DateUtil.getSdfTimes(); } else { + // 判断表中是否有数据,有数据就创建新版本 Integer latestVersionByCode = formService.getLatestVersionByCode(formCode); - version = latestVersionByCode + 1; + // 判断表是否存在 + FormPO formPO = formService.getPOByCodeAndVersion(formCode, latestVersionByCode); + Integer dynamicCount = formService.countDynamicTable(formPO.getFormTableName()); + if (dynamicCount > 0) { + Integer count = formReportService.count(formPO.getFormTableName()); + if (count == 0) { + createNewTable = false; + formId = formPO.getFormId(); + // 删列 + formFieldService.deleteByFormIds(Arrays.asList(formPO.getFormId())); + // 删表 + formService.deleteTable(formPO.getFormTableName(), false); + } else { + version = latestVersionByCode + 1; + } + } else { + LOG.debug("动态表不存在"); + createNewTable = false; + version = latestVersionByCode; + formId = formPO.getFormId(); + // 删列 + formFieldService.deleteByFormIds(Arrays.asList(formPO.getFormId())); + } } // df:dynamicForm 动态表单 @@ -103,13 +133,17 @@ public class FormDesignServiceImpl extends DefaultBaseService implements IFormDe formVO.setAppUpdatePageCode(getAppUpdatePageCode(model, formDesignVO.getFormType())); formVO.setAppShowPageCode(getAppShowPageCode(model, formDesignVO.getFormType())); - String formId = formService.saveReturnId(formVO); + if (createNewTable) { + formId = formService.saveReturnId(formVO); + } else { + formService.update(formId, formVO); + } LOG.debug("保存表单字段"); - formFields.forEach(formFieldVO -> { + for(FormFieldVO formFieldVO: formFields) { formFieldVO.setFormId(formId); formFieldService.save(formFieldVO); - }); + } LOG.debug("建表"); String createTableSQL = getCreateTableSQL(tableName, formDesignVO.getFormName(), formFields); @@ -129,11 +163,6 @@ public class FormDesignServiceImpl extends DefaultBaseService implements IFormDe model.put(ISystemConstant.FORM_HIDDEN_INPUT_LIST, Arrays.asList(new String[]{"formCode", "formVersion"})); model.put(ISystemConstant.FORM_COMMIT_PARAM_LIST, Arrays.asList(new String[]{"formCode", "formVersion"})); model.put(ISystemConstant.FORM_TYPE, formType); - } else if(StringUtils.equals(FormTypeEnum.FREE_REPORT.getValue(), formType)) { - model.put(ISystemConstant.FORM_COMMIT_URL, "api/form-report-public/save/code/{formCode}/version/{formVersion}"); - model.put(ISystemConstant.FORM_HIDDEN_INPUT_LIST, Arrays.asList(new String[]{"formCode", "formVersion"})); - model.put(ISystemConstant.FORM_COMMIT_PARAM_LIST, Arrays.asList(new String[]{"formCode", "formVersion"})); - model.put(ISystemConstant.FORM_TYPE, formType); } else if (StringUtils.equals(FormTypeEnum.OA.getValue(), formType)) { model.put(ISystemConstant.FORM_COMMIT_URL, "api/oa-form-report/save/definition-id/{processDefinitionId}/code/{formCode}/version/{formVersion}"); model.put(ISystemConstant.FORM_HIDDEN_INPUT_LIST, Arrays.asList(new String[]{"processDefinitionId", "formCode", "formVersion"})); @@ -158,7 +187,7 @@ public class FormDesignServiceImpl extends DefaultBaseService implements IFormDe model.put(ISystemConstant.FORM_HIDDEN_INPUT_LIST, Arrays.asList(new String[]{"formCode", "formVersion"})); model.put(ISystemConstant.FORM_INIT_URL, "api/form-report/get/code/{formCode}/version/{formVersion}/uid/{uid}"); model.put(ISystemConstant.FORM_INIT_PARAM_LIST, Arrays.asList(new String[]{"formCode", "formVersion"})); - model.put(ISystemConstant.FORM_COMMIT_URL, "api/form-report/save/code/{formCode}/version/{formVersion}"); + model.put(ISystemConstant.FORM_COMMIT_URL, "api/form-report/save/code/{formCode}/version/{formVersion}/uid/{uid}"); model.put(ISystemConstant.FORM_COMMIT_PARAM_LIST, Arrays.asList(new String[]{"formCode", "formVersion"})); model.put(ISystemConstant.FORM_TYPE, formType); } else if (StringUtils.equals(FormTypeEnum.OA.getValue(), formType)) { @@ -236,7 +265,7 @@ public class FormDesignServiceImpl extends DefaultBaseService implements IFormDe model.put(ISystemConstant.FORM_HIDDEN_INPUT_LIST, Arrays.asList(new String[]{"formCode", "formVersion"})); model.put(ISystemConstant.FORM_INIT_URL, "app/form-report/get/code/{formCode}/version/{formVersion}/uid/{uid}"); model.put(ISystemConstant.FORM_INIT_PARAM_LIST, Arrays.asList(new String[]{"formCode", "formVersion"})); - model.put(ISystemConstant.FORM_COMMIT_URL, "app/form-report/save/code/{formCode}/version/{formVersion}"); + model.put(ISystemConstant.FORM_COMMIT_URL, "app/form-report/update/code/{formCode}/version/{formVersion}/uid/{uid}"); model.put(ISystemConstant.FORM_COMMIT_PARAM_LIST, Arrays.asList(new String[]{"formCode", "formVersion"})); model.put(ISystemConstant.FORM_TYPE, formType); } else if (StringUtils.equals(FormTypeEnum.OA.getValue(), formType)) { diff --git a/module-form/src/main/java/ink/wgink/module/form/service/design/impl/FormFieldServiceImpl.java b/module-form/src/main/java/ink/wgink/module/form/service/design/impl/FormFieldServiceImpl.java index 759852f4..355a5d53 100644 --- a/module-form/src/main/java/ink/wgink/module/form/service/design/impl/FormFieldServiceImpl.java +++ b/module-form/src/main/java/ink/wgink/module/form/service/design/impl/FormFieldServiceImpl.java @@ -47,6 +47,13 @@ public class FormFieldServiceImpl extends DefaultBaseService implements IFormFie formFieldDao.delete(params); } + @Override + public void deleteByFormIds(List formIds) { + Map params = getHashMap(2); + params.put("formIds", formIds); + formFieldDao.delete(params); + } + @Override public void update(String fieldId, FormFieldVO formFieldVO) { Map params = HashMapUtil.beanToMap(formFieldVO); diff --git a/module-form/src/main/java/ink/wgink/module/form/service/design/impl/FormServiceImpl.java b/module-form/src/main/java/ink/wgink/module/form/service/design/impl/FormServiceImpl.java index 0c738b76..53598260 100644 --- a/module-form/src/main/java/ink/wgink/module/form/service/design/impl/FormServiceImpl.java +++ b/module-form/src/main/java/ink/wgink/module/form/service/design/impl/FormServiceImpl.java @@ -9,6 +9,7 @@ import ink.wgink.module.form.dao.design.IFormDao; import ink.wgink.module.form.pojo.dtos.design.FormDTO; import ink.wgink.module.form.pojo.pos.design.FormPO; import ink.wgink.module.form.pojo.vos.design.FormVO; +import ink.wgink.module.form.service.design.IFormFieldService; import ink.wgink.module.form.service.design.IFormService; import ink.wgink.module.form.service.report.IFormReportService; import ink.wgink.pojo.ListPage; @@ -28,6 +29,8 @@ public class FormServiceImpl extends DefaultBaseService implements IFormService private IFormDao formDao; @Autowired private IFormReportService formReportService; + @Autowired + private IFormFieldService formFieldService; @Override public void createDynamicForm(String createTableSQL) { @@ -35,7 +38,13 @@ public class FormServiceImpl extends DefaultBaseService implements IFormService } @Override - public void deleteTable(String tableName) { + public void deleteTable(String tableName, boolean checkExist) { + if (checkExist) { + Integer count = formDao.countTable(tableName); + if (count == 0) { + return; + } + } StringBuffer sqlSB = new StringBuffer("DROP TABLE `").append(tableName).append("`;"); deleteDynamicForm(sqlSB.toString()); } @@ -75,6 +84,11 @@ public class FormServiceImpl extends DefaultBaseService implements IFormService formDao.deleteDynamicFormField(alterFieldSQL); } + @Override + public Integer countDynamicTable(String tableName) { + return formDao.countTable(tableName); + } + @Override public void save(FormVO formVO) { saveReturnId(formVO); @@ -96,8 +110,10 @@ public class FormServiceImpl extends DefaultBaseService implements IFormService @Override public void delete(List ids) { - // 判断表单是否有数据,有数据不能删除 - deleteTable(ids); + List formDTOs = listByIds(ids); + deleteTable(formDTOs); + // 删除列 + formFieldService.deleteByFormIds(ids); Map params = getHashMap(2); params.put("formIds", ids); formDao.delete(params); @@ -111,14 +127,18 @@ public class FormServiceImpl extends DefaultBaseService implements IFormService formDao.remove(params); } - private void deleteTable(List ids) { - List formDTOs = listByIds(ids); + private void deleteTable(List formDTOs) { for (FormDTO formDTO : formDTOs) { - Integer count = formReportService.count(formDTO.getFormTableName()); - if (count > 0) { + Integer tableCount = countDynamicTable(formDTO.getFormTableName()); + if (tableCount == 0) { + // 表不存在 + continue; + } + Integer dataCount = formReportService.count(formDTO.getFormTableName()); + if (dataCount > 0) { throw new RemoveException(formDTO.getFormTableName() + "表中存在数据,不能删除"); } - deleteTable(formDTO.getFormTableName()); + deleteTable(formDTO.getFormTableName(), false); } } diff --git a/module-form/src/main/java/ink/wgink/module/form/service/report/IFormReportService.java b/module-form/src/main/java/ink/wgink/module/form/service/report/IFormReportService.java index f49b77ff..73ac0f63 100644 --- a/module-form/src/main/java/ink/wgink/module/form/service/report/IFormReportService.java +++ b/module-form/src/main/java/ink/wgink/module/form/service/report/IFormReportService.java @@ -35,14 +35,22 @@ public interface IFormReportService { void updateByUserId(String userId, String formCode, Integer formVersion, String uid, Map params); + void updateByCreatorAndModifier(String creator, String modifier, String formCode, Integer formVersion, String uid, Map params); + void updateProcessInstanceId(String formCode, Integer formVersion, String uid, String processInstanceId); Map get(String formCode, Integer formVersion, String uid); + Map getByUserId(String userId, String formCode, Integer formVersion, String uid); + List> list(String formCode, Integer formVersion, Map params); + List> listByUserId(String userId, String formCode, Integer formVersion, Map params); + SuccessResultList>> listPage(String formCode, Integer formVersion, ListPage page); + SuccessResultList>> listPageByUserId(String userId, String formCode, Integer formVersion, ListPage page); + SuccessResultList>> listPageAllField(String formCode, Integer formVersion, ListPage page); List listShowField(String formCode, Integer formVersion); diff --git a/module-form/src/main/java/ink/wgink/module/form/service/report/impl/FormReportServiceImpl.java b/module-form/src/main/java/ink/wgink/module/form/service/report/impl/FormReportServiceImpl.java index b49b6074..f8aa41bf 100644 --- a/module-form/src/main/java/ink/wgink/module/form/service/report/impl/FormReportServiceImpl.java +++ b/module-form/src/main/java/ink/wgink/module/form/service/report/impl/FormReportServiceImpl.java @@ -132,6 +132,11 @@ public class FormReportServiceImpl extends DefaultBaseService implements IFormRe @Override public void updateByUserId(String userId, String formCode, Integer formVersion, String uid, Map params) { + updateByCreatorAndModifier(null, userId, formCode, formVersion, uid, params); + } + + @Override + public void updateByCreatorAndModifier(String creator, String modifier, String formCode, Integer formVersion, String uid, Map params) { FormPO formPO = formService.getPOByCodeAndVersion(formCode, formVersion); checkForm(formPO); @@ -143,13 +148,14 @@ public class FormReportServiceImpl extends DefaultBaseService implements IFormRe kvList.add(Arrays.asList(new String[]{kv.getKey(), "" + kv.getValue()})); } kvList.add(Arrays.asList(new String[]{IFormDesignService.FIELD_GMT_MODIFIED, DateUtil.getTime()})); - kvList.add(Arrays.asList(new String[]{IFormDesignService.FIELD_MODIFIER, userId})); + kvList.add(Arrays.asList(new String[]{IFormDesignService.FIELD_MODIFIER, modifier})); Map updateParams = getHashMap((params.size() + 3) * 2); updateParams.put(IFormDesignService.FIELD_UID, uid); updateParams.put(IFormDesignService.PARAM_KV_LIST, kvList); updateParams.put(IFormDesignService.PARAM_FORM_CODE, formCode); updateParams.put(IFormDesignService.PARAM_FORM_VERSION, formVersion); + updateParams.put(IFormDesignService.FIELD_CREATOR, creator); formReportDao.update(updateParams); // 更新mainTitle @@ -179,8 +185,23 @@ public class FormReportServiceImpl extends DefaultBaseService implements IFormRe return formReportDao.get(params); } + @Override + public Map getByUserId(String userId, String formCode, Integer formVersion, String uid) { + Map params = getHashMap(2); + params.put(IFormDesignService.FIELD_UID, uid); + params.put(IFormDesignService.PARAM_FORM_CODE, formCode); + params.put(IFormDesignService.PARAM_FORM_VERSION, formVersion); + params.put(IFormDesignService.FIELD_CREATOR, userId); + return formReportDao.get(params); + } + @Override public List> list(String formCode, Integer formVersion, Map params) { + return listByUserId(null, formCode, formVersion, params); + } + + @Override + public List> listByUserId(String userId, String formCode, Integer formVersion, Map params) { FormPO formPO = formService.getPOByCodeAndVersion(formCode, formVersion); checkForm(formPO); @@ -190,17 +211,24 @@ public class FormReportServiceImpl extends DefaultBaseService implements IFormRe queryParams.put(IFormDesignService.PARAM_FORM_VERSION, formVersion); queryParams.put(IFormDesignService.PARAM_QUERY_LIST, queryList); queryParams.put(IFormDesignService.PARAM_LIST_SHOW_FIELD, listShowField(formPO)); + queryParams.put(IFormDesignService.FIELD_CREATOR, userId); return formReportDao.list(queryParams); } @Override public SuccessResultList>> listPage(String formCode, Integer formVersion, ListPage page) { + return listPageByUserId(null, formCode, formVersion, page); + } + + @Override + public SuccessResultList>> listPageByUserId(String userId, String formCode, Integer formVersion, ListPage page) { FormPO formPO = formService.getPOByCodeAndVersion(formCode, formVersion); checkForm(formPO); List queryList = conditionList(page.getParams()); Map queryParams = getListQueryParams(formPO, queryList); queryParams.put(IFormDesignService.PARAM_LIST_SHOW_FIELD, listShowField(formPO)); + queryParams.put(IFormDesignService.FIELD_CREATOR, userId); return listPage(page, queryParams); } diff --git a/module-form/src/main/resources/mybatis/mapper/design/form-field-mapper.xml b/module-form/src/main/resources/mybatis/mapper/design/form-field-mapper.xml index 8f669529..21288f98 100644 --- a/module-form/src/main/resources/mybatis/mapper/design/form-field-mapper.xml +++ b/module-form/src/main/resources/mybatis/mapper/design/form-field-mapper.xml @@ -68,7 +68,7 @@ DELETE FROM form_field - WHERE + field_id IN @@ -76,14 +76,17 @@ + AND form_id = #{formId} + AND form_id IN #{formIds[${index}]} + diff --git a/module-form/src/main/resources/mybatis/mapper/design/form-mapper.xml b/module-form/src/main/resources/mybatis/mapper/design/form-mapper.xml index e97042a3..c4bc0010 100644 --- a/module-form/src/main/resources/mybatis/mapper/design/form-mapper.xml +++ b/module-form/src/main/resources/mybatis/mapper/design/form-mapper.xml @@ -76,26 +76,36 @@ ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='表单'; - + ${_parameter} - + ${_parameter} - + ${_parameter} - + ${_parameter} + + + INSERT INTO form_form( diff --git a/module-form/src/main/resources/mybatis/mapper/form-report/form-report-mapper.xml b/module-form/src/main/resources/mybatis/mapper/form-report/form-report-mapper.xml index e5c24c85..099819a9 100644 --- a/module-form/src/main/resources/mybatis/mapper/form-report/form-report-mapper.xml +++ b/module-form/src/main/resources/mybatis/mapper/form-report/form-report-mapper.xml @@ -39,7 +39,13 @@ ${item[0]} = '${item[1]}' WHERE + is_delete = 0 + AND uid = #{uid} + + AND + creator = #{creator} + @@ -61,6 +67,10 @@ is_delete = 0 AND uid = #{uid} + + AND + creator = #{creator} + @@ -81,6 +91,10 @@ df_${formCode}_v${formVersion} WHERE is_delete = 0 + + AND + creator = #{creator} + AND uid IN diff --git a/module-form/src/main/resources/static/form-design/modules/components/date.js b/module-form/src/main/resources/static/form-design/modules/components/date.js index fa993be4..cb90a344 100644 --- a/module-form/src/main/resources/static/form-design/modules/components/date.js +++ b/module-form/src/main/resources/static/form-design/modules/components/date.js @@ -8,7 +8,7 @@ layui.define(['jquery', 'laydate', 'formUtils'], function(exports) { '
', ' ', '
', - ' ', + ' ', '
', '
' ]; diff --git a/module-form/src/main/resources/static/form-design/modules/components/uploadImage.js b/module-form/src/main/resources/static/form-design/modules/components/uploadImage.js index 857cd8e5..3fc6f4f8 100644 --- a/module-form/src/main/resources/static/form-design/modules/components/uploadImage.js +++ b/module-form/src/main/resources/static/form-design/modules/components/uploadImage.js @@ -11,10 +11,10 @@ layui.define(['jquery', 'upload', 'dialog', 'restajax', 'formUtils'], function(e var HTML_ARRAY = [ '
', ' ', - ' ', - '
', + '
', ' ', '
', '
', diff --git a/module-form/src/main/resources/static/form-design/modules/formDesigner.js b/module-form/src/main/resources/static/form-design/modules/formDesigner.js index f53d6ebb..694bcddb 100644 --- a/module-form/src/main/resources/static/form-design/modules/formDesigner.js +++ b/module-form/src/main/resources/static/form-design/modules/formDesigner.js @@ -120,11 +120,10 @@ layui.config({ '
', ' ', '
', - '
提示:OA表单数据参与OA流程;默认表单中APP的页面校验用户token;自由上报APP不校验token,但校验refer,需要提交时传唯一用户标识“creator”。
', + '
提示:OA表单数据参与OA流程;默认表单中APP的页面校验用户token,可对接开放接口,不校验token,但需要传userId;
', '
', '
', ' ', diff --git a/module-form/src/main/resources/static/form/css/form-app.css b/module-form/src/main/resources/static/form/css/form-app.css new file mode 100644 index 00000000..371f9cef --- /dev/null +++ b/module-form/src/main/resources/static/form/css/form-app.css @@ -0,0 +1,239 @@ +.layui-card-body { + margin-bottom: 60px; +} +.layui-form-item { + margin-bottom: 0px; + padding: 15px 0; + clear: both; + border-top: 1px; + border-left: 0; + border-right: 0; + border-bottom: 0; + border-color: #e6e6e6; + border-style: solid; + text-align: right; +} +.layui-form-item:first-child { + border-top: 0; +} + +.layui-input-block { + border: 0 !important; +} +.layui-form-item .layui-form-label { + border: 0; + text-align: left; + padding: 8px 0; + background-color: #FFF; +} +.layui-form-pane .layui-input { + border: 0; + text-align: right; +} + +.layui-form-pane .layui-form-text .layui-textarea { + border-width: 0; + padding: 0; + line-height: 0.3rem; + resize: none; +} + +.layui-form-item .layui-upload-file-btn { +} + +.layui-form-item .upload-image-box { + clear: both; + width: 100%; + padding: 0; + display: block; +} + +.layui-form-item:last-child { + margin-bottom: 1rem; +} + +.layui-btn { + height: 30px; + line-height: 30px; + padding: 0 8px; +} + +.layui-layout-admin .layui-footer { + padding: 0.1rem 0; +} + +.form-report-foot { + padding: 0 !important; +} +/* 上传图片 */ +.form-upload-image { + position: relative; + display: inline-block; + margin: 0 0.22rem 0.15rem 0; +} + +.form-upload-image:nth-child(3n) { + margin: 0 0 0.15rem 0; +} + +.form-upload-image:last-child { + margin-right: 0; +} + +.form-upload-image img { + width: 2.15rem; + height: 2.15rem; + object-fit: cover; +} + +.layui-btn-container { + text-align: left; +} + +.form-upload-image .delete-btn { + position: absolute; + top: 0; + right: 0; + margin: 0; +} + +/* 上传附件 */ +.form-upload-file { + +} + +.form-upload-file .operation { + text-align: center; +} + +.form-upload-file .delete-btn { + margin: 0; +} + +/* 上传视频 */ +.form-upload-video { + position: relative; + display: inline-block; + margin: 0.1rem 0.1rem 0 0; +} + +.form-upload-video:last-child { + margin-right: 0; +} + +.form-upload-video .delete-btn { + position: absolute; + top: 0; + right: 0; + margin: 0; +} + +/* 上传音频 */ +.form-upload-audio { + position: relative; + display: inline-block; + margin: 0.1rem 0.1rem 0 0; +} + +.form-upload-audio:last-child { + margin-right: 0; +} + +.form-upload-audio .delete-btn { + position: absolute; + top: 0; + right: 0; + margin: 0; +} + +/* 用户选择 */ +.select-user { + height: 100%; + position: relative; + overflow: hidden; +} +.select-user .list { + width: 316px; + overflow-y: auto; + overflow-x: hidden; + max-height: 356px; +} + +.select-user .list .item { + display: flex; + flex-direction: row; + align-items: center; + margin: 0 5px; + padding: 5px; + border-top: 1px solid; + border-left: 1px solid; + border-right: 1px solid; +} + +.select-user .list .item { + display: flex; + flex-direction: row; + align-items: center; + margin: 0 5px; + padding: 5px; + border-top: 1px dotted; + border-left: 1px dotted; + border-right: 1px dotted; + border-color: silver; + cursor: pointer; +} + +.select-user .active { + background-color: #f1f1f1; +} + +.select-user .list .item:hover { + background-color: #f1f1f1; +} + +.select-user .list .item:last-child { + margin-bottom: 40px; + border-bottom: 1px dotted silver; +} + +.select-user .list .item .avatar { + width: 40px; + height: 40px; +} + +.select-user .list .item .avatar img { + width: 40px; + height: 40px; +} + +.select-user .list .item .info { + display: flex; + flex-direction: column; + margin-left: 10px; +} + +.select-user .list .item .info .text { + width: 200px; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; +} + +.select-user .list .item .checkbox { + display: none; + margin-left: 5px; + font-size: 25px; +} + +.select-user .list .active .checkbox { + display: block; +} + +.select-user .foot { + position: absolute; + bottom: 0; + padding: 5px 0; + width: 100%; + text-align: center; + background-color: #FFF; +} diff --git a/module-form/src/main/resources/static/form/js/form-util.js b/module-form/src/main/resources/static/form/js/form-util.js index 7da593b2..60ef60e0 100644 --- a/module-form/src/main/resources/static/form/js/form-util.js +++ b/module-form/src/main/resources/static/form/js/form-util.js @@ -10,12 +10,18 @@ function FormUtil(layui, viewer) { /** * 初始化图片上传 - * @param fieldName - * @param maxCount + * @param opt */ - this.initUploadImage = function (fieldName, maxCount) { - maxCount = maxCount ? parseInt(maxCount) : 9 - maxCount = maxCount < 0 ? 9 : maxCount; + function initUploadImage(opt) { + var maxCount = opt.maxCount ? parseInt(opt.maxCount) : 9 + maxCount = opt.maxCount < 0 ? 9 : opt.maxCount; + var fieldName = opt.fieldName; + var headers = opt.headers; + headers = headers ? headers : {}; + var isApp = opt.isApp; + var isAppRelease = opt.isAppRelease; + var isShow = opt.isShow; + var id = '#' + fieldName; var fileBoxId = id + 'FileBox'; var uploadBtnId = id + 'UploadBtn'; @@ -52,15 +58,28 @@ function FormUtil(layui, viewer) { } function addClick() { + var layerLoadingIndex; + var url = 'api/file/v2/upload-image'; + if (isApp) { + url = 'app/file/v2/upload-image' + } + if (isAppRelease) { + url = 'app/file/v2/upload-image-release' + } upload.render({ elem: uploadBtnId, - url: 'api/file/v2/upload-image', + url: url, accept: 'images', acceptMime: 'image/*', field: 'image', exts: 'jpg|png|gif|bmp|jpeg', name: fieldName, + headers: headers, + before: function (obj) { + layerLoadingIndex = layer.msg('上传中...', {icon: 16, time: 0, shade: 0.3}) + }, done: function (res, index, upload) { + layer.close(layerLoadingIndex); var name = this.name; var files = $('#' + this.name).val(); if (files.length > 0) { @@ -73,6 +92,7 @@ function FormUtil(layui, viewer) { }); }, error: function (index, upload) { + layer.close(layerLoadingIndex); layer.msg('文件上传失败'); }, progress: function (n, elem, res, index) { @@ -105,17 +125,92 @@ function FormUtil(layui, viewer) { init(function () { viewerObj[fieldName] = new Viewer(document.getElementById(fieldName + 'FileBox'), {navbar: false}); }); - addClick(); + + if (!isShow) { + addClick(); + } else { + $(uploadBtnId).hide(); + } + } + + /** + * 初始化图片上传 + * @param fieldName + * @param maxCount + */ + this.initUploadImage = function (fieldName, maxCount) { + initUploadImage({ + fieldName: fieldName, + maxCount: maxCount, + isApp: false, + isAppRelease: false, + isShow: false + }); + } + + /** + * 初始化APP图片上传 + * @param fieldName + * @param maxCount + * @param headers + */ + this.initAppUploadImage = function (fieldName, maxCount, headers) { + initUploadImage({ + fieldName: fieldName, + maxCount: maxCount, + isApp: true, + isAppRelease: false, + isShow: false, + headers: headers + }); + } + + /** + * 初始化APP放行图片上传 + * @param fieldName + * @param maxCount + * @param headers + */ + this.initAppReleaseUploadImage = function (fieldName, maxCount, headers) { + initUploadImage({ + fieldName: fieldName, + maxCount: maxCount, + isApp: false, + isAppRelease: true, + isShow: false, + headers: headers + }); + } + + /** + * 显示上传图片 + * @param fieldName + * @param maxCount + */ + this.initShowUploadImage = function (fieldName, maxCount) { + initUploadImage({ + fieldName: fieldName, + maxCount: maxCount, + isApp: false, + isAppRelease: false, + isShow: true + }); } /** * 初始化文件上传 - * @param fieldName - * @param maxCount + * @param opt */ - this.initUploadFile = function (fieldName, maxCount) { - maxCount = maxCount ? parseInt(maxCount) : 3 - maxCount = maxCount < 0 ? 3 : maxCount; + function initUploadFile(opt) { + var maxCount = opt.maxCount ? parseInt(opt.maxCount) : 3 + maxCount = opt.maxCount < 0 ? 3 : opt.maxCount; + var fieldName = opt.fieldName; + var headers = opt.headers; + headers = headers ? headers : {}; + var isApp = opt.isApp; + var isAppRelease = opt.isAppRelease; + var isShow = opt.isShow; + var id = '#' + fieldName; var fileBoxId = id + 'FileBox'; var uploadBtnId = id + 'UploadBtn'; @@ -175,9 +270,17 @@ function FormUtil(layui, viewer) { } function addClick() { + var layerLoadingIndex; + var url = 'api/file/v2/upload-file'; + if (isApp) { + url = 'app/file/v2/upload-file' + } + if (isAppRelease) { + url = 'app/file/v2/upload-file-release' + } upload.render({ elem: uploadBtnId, - url: 'api/file/v2/upload-file', + url: url, accept: 'file', acceptMime: [ 'application/pdf', @@ -195,7 +298,12 @@ function FormUtil(layui, viewer) { field: 'file', exts: 'pdf|doc|docx|xls|xlsx|ppt|pptx|wps|txt|rar|zip', name: fieldName, + headers: headers, + before: function (obj) { + layerLoadingIndex = layer.msg('上传中...', {icon: 16, time: 0, shade: 0.3}) + }, done: function (res, index, upload) { + layer.close(layerLoadingIndex); var name = this.name; var files = $('#' + this.name).val(); if (files.length > 0) { @@ -206,6 +314,7 @@ function FormUtil(layui, viewer) { init(); }, error: function (index, upload) { + layer.close(layerLoadingIndex); layer.msg('文件上传失败'); }, progress: function (n, elem, res, index) { @@ -235,21 +344,96 @@ function FormUtil(layui, viewer) { } init(); - addClick(); + if (!isShow) { + addClick(); + } else { + $(uploadBtnId).hide(); + } + + } + + /** + * 初始化文件上传 + * @param fieldName + * @param maxCount + */ + this.initUploadFile = function (fieldName, maxCount) { + initUploadFile({ + fieldName: fieldName, + maxCount: maxCount, + isApp: false, + isAppRelease: false, + isShow: false + }) + } + + /** + * 初始化APP文件上传 + * @param fieldName + * @param maxCount + * @param headers + */ + this.initAppUploadFile = function (fieldName, maxCount, headers) { + initUploadFile({ + fieldName: fieldName, + maxCount: maxCount, + isApp: true, + isAppRelease: false, + isShow: false, + headers: headers + }); + } + + /** + * 初始化APP放行文件上传 + * @param fieldName + * @param maxCount + * @param headers + */ + this.initAppReleaseUploadFile = function (fieldName, maxCount, headers) { + initUploadFile({ + fieldName: fieldName, + maxCount: maxCount, + isApp: false, + isAppRelease: true, + isShow: false, + headers: headers + }); + } + + /** + * 显示上传文件 + * @param fieldName + * @param maxCount + */ + this.initShowUploadFile = function (fieldName, maxCount) { + initUploadFile({ + fieldName: fieldName, + maxCount: maxCount, + isApp: false, + isAppRelease: false, + isShow: true + }); } /** * 初始化视频上传 - * @param fileName - * @param maxCount + * @param opt */ - this.initUploadVideo = function (fileName, maxCount) { - maxCount = maxCount ? parseInt(maxCount) : 1 - maxCount = maxCount < 0 ? 1 : maxCount; - var id = '#' + fileName; + function initUploadVideo(opt) { + var maxCount = opt.maxCount ? parseInt(opt.maxCount) : 1 + maxCount = opt.maxCount < 0 ? 1 : opt.maxCount; + var fieldName = opt.fieldName; + var headers = opt.headers; + headers = headers ? headers : {}; + var isApp = opt.isApp; + var isAppRelease = opt.isAppRelease; + var isShow = opt.isShow; + + var id = '#' + fieldName; var fileBoxId = id + 'FileBox'; var uploadBtnId = id + 'UploadBtn'; - var deleteBtnClass = '.delete-' + fileName + '-btn'; + var deleteBtnClass = '.delete-' + fieldName + '-btn'; function init() { var fileIds = $(id).val(); @@ -262,7 +446,7 @@ function FormUtil(layui, viewer) { ' ', ' 您的浏览器不支持 video 标签', ' ', - ' ', + ' ', ' ', ' ', '
', @@ -282,15 +466,28 @@ function FormUtil(layui, viewer) { } function addClick() { + var layerLoadingIndex; + var url = 'api/file/v2/upload-video'; + if (isApp) { + url = 'app/file/v2/upload-video' + } + if (isAppRelease) { + url = 'app/file/v2/upload-video-release' + } upload.render({ elem: uploadBtnId, - url: 'api/file/v2/upload-video', + url: url, accept: 'video', acceptMime: 'video/mp4', exts: 'mp4', field: 'video', - name: fileName, + name: fieldName, + headers: headers, + before: function (obj) { + layerLoadingIndex = layer.msg('上传中...', {icon: 16, time: 0, shade: 0.3}) + }, done: function (res, index, upload) { + layer.close(layerLoadingIndex); var name = this.name; var files = $('#' + this.name).val(); if (files.length > 0) { @@ -301,6 +498,7 @@ function FormUtil(layui, viewer) { init(); }, error: function (index, upload) { + layer.close(layerLoadingIndex); layer.msg('文件上传失败'); }, progress: function (n, elem, res, index) { @@ -329,21 +527,92 @@ function FormUtil(layui, viewer) { } init(); - addClick(); + + if (!isShow) { + addClick(); + } else { + $(uploadBtnId).hide(); + } } /** - * 初始化音频上传 - * @param fileName + * 初始化视频上传 + * @param fieldName * @param maxCount */ - this.initUploadAudio = function (fileName, maxCount) { - maxCount = maxCount ? parseInt(maxCount) : 1 - maxCount = maxCount < 0 ? 1 : maxCount; - var id = '#' + fileName; + this.initUploadVideo = function (fieldName, maxCount) { + initUploadVideo({ + fieldName: fieldName, + maxCount: maxCount, + isApp: false, + isAppRelease: false, + isShow: false + }) + } + + /** + * 初始化APP视频上传 + * @param fieldName + * @param maxCount + * @param headers + */ + this.initAppUploadVideo = function (fieldName, maxCount, headers) { + initUploadVideo({ + fieldName: fieldName, + maxCount: maxCount, + isApp: true, + isAppRelease: false, + isShow: false, + headers: headers + }); + } + + /** + * 初始化APP放行视频上传 + * @param fieldName + * @param maxCount + * @param headers + */ + this.initAppReleaseUploadVideo = function (fieldName, maxCount, headers) { + initUploadVideo({ + fieldName: fieldName, + maxCount: maxCount, + isApp: false, + isAppRelease: true, + isShow: false, + headers: headers + }); + } + + /** + * 显示上传视频 + * @param fieldName + * @param maxCount + */ + this.initShowUploadVideo = function (fieldName, maxCount) { + initUploadVideo({ + fieldName: fieldName, + maxCount: maxCount, + isApp: false, + isAppRelease: false, + isShow: true + }); + } + + function initUploadAudio(opt) { + var maxCount = opt.maxCount ? parseInt(opt.maxCount) : 1 + maxCount = opt.maxCount < 0 ? 1 : opt.maxCount; + var fieldName = opt.fieldName; + var headers = opt.headers; + headers = headers ? headers : {}; + var isApp = opt.isApp; + var isAppRelease = opt.isAppRelease; + var isShow = opt.isShow; + + var id = '#' + fieldName; var fileBoxId = id + 'FileBox'; var uploadBtnId = id + 'UploadBtn'; - var deleteBtnClass = '.delete-' + fileName + '-btn'; + var deleteBtnClass = '.delete-' + fieldName + '-btn'; function init() { var fileIds = $(id).val(); @@ -355,7 +624,7 @@ function FormUtil(layui, viewer) { ' ', - ' ', + ' ', ' ', ' ', '
', @@ -375,9 +644,17 @@ function FormUtil(layui, viewer) { } function addClick() { + var layerLoadingIndex; + var url = 'api/file/v2/upload-audio'; + if (isApp) { + url = 'app/file/v2/upload-audio' + } + if (isAppRelease) { + url = 'app/file/v2/upload-audio-release' + } upload.render({ elem: uploadBtnId, - url: 'api/file/v2/upload-audio', + url: url, accept: 'audio', acceptMime: [ 'audio/wav', @@ -385,8 +662,13 @@ function FormUtil(layui, viewer) { ], exts: 'wav|mp3', field: 'audio', - name: fileName, + name: fieldName, + headers: headers, + before: function (obj) { + layerLoadingIndex = layer.msg('上传中...', {icon: 16, time: 0, shade: 0.3}) + }, done: function (res, index, upload) { + layer.close(layerLoadingIndex); var name = this.name; var files = $('#' + this.name).val(); if (files.length > 0) { @@ -397,6 +679,7 @@ function FormUtil(layui, viewer) { init(); }, error: function (index, upload) { + layer.close(layerLoadingIndex); layer.msg('文件上传失败'); }, progress: function (n, elem, res, index) { @@ -425,7 +708,76 @@ function FormUtil(layui, viewer) { } init(); - addClick(); + + if (!isShow) { + addClick(); + } else { + $(uploadBtnId).hide(); + } + } + + /** + * 初始化音频上传 + * @param fieldName + * @param maxCount + */ + this.initUploadAudio = function (fieldName, maxCount) { + initUploadAudio({ + fieldName: fieldName, + maxCount: maxCount, + isApp: false, + isAppRelease: false, + isShow: false + }) + } + + /** + * 初始化APP音频上传 + * @param fieldName + * @param maxCount + * @param headers + */ + this.initAppUploadAudio = function (fieldName, maxCount, headers) { + initUploadAudio({ + fieldName: fieldName, + maxCount: maxCount, + isApp: true, + isAppRelease: false, + isShow: false, + headers: headers + }); + } + + /** + * 初始化APP放行音频上传 + * @param fieldName + * @param maxCount + * @param headers + */ + this.initAppReleaseUploadAudio = function (fieldName, maxCount, headers) { + initUploadAudio({ + fieldName: fieldName, + maxCount: maxCount, + isApp: false, + isAppRelease: true, + isShow: false, + headers: headers + }); + } + + /** + * 显示上传音频 + * @param fieldName + * @param maxCount + */ + this.initShowUploadAudio = function (fieldName, maxCount) { + initUploadAudio({ + fieldName: fieldName, + maxCount: maxCount, + isApp: false, + isAppRelease: false, + isShow: true + }); } /** @@ -630,6 +982,7 @@ function FormUtil(layui, viewer) { var boxId = '#' + item.fieldName + 'Box'; $(boxId).css('position', 'relative'); $(boxId).append('
'); + $(boxId).filter('input, button, textarea').attr('disabled', 'disabled'); } } } diff --git a/module-form/src/main/resources/static/form/js/rem.js b/module-form/src/main/resources/static/form/js/rem.js new file mode 100644 index 00000000..028387da --- /dev/null +++ b/module-form/src/main/resources/static/form/js/rem.js @@ -0,0 +1,12 @@ +function setPage() { + var html = document.getElementsByTagName('html')[0]; + var deviceWidth = document.documentElement.clientWidth; + var scale = deviceWidth / 750;//psd图上的宽度 + html.style.fontSize = scale * 100 + 'px'; +} + +setPage(); + +window.onresize = function () { + setPage(); +} diff --git a/module-form/src/main/resources/templates/ftl/page/app/app-form-save.ftl b/module-form/src/main/resources/templates/ftl/page/app/app-form-save.ftl index 6f75417c..4f8c1757 100644 --- a/module-form/src/main/resources/templates/ftl/page/app/app-form-save.ftl +++ b/module-form/src/main/resources/templates/ftl/page/app/app-form-save.ftl @@ -12,7 +12,8 @@ - + +
@@ -22,20 +23,18 @@ <#list fields as field> ${field.html} -
-
- <#if formType == "oa"> - - <#else> - - +
+ <#if formType == "oa"> + + <#else> + +
@@ -44,7 +43,7 @@
- +
@@ -22,18 +23,16 @@ <#list fields as field> ${field.html} -
-
- <#if formType == "oa"> - - <#else> - - +
+ <#if formType == "oa"> + + <#else> + +
@@ -42,7 +41,7 @@
- +
@@ -22,20 +23,18 @@ <#list fields as field> ${field.html} -
-
- <#if formType == "oa"> - - <#else> - - +
+ <#if formType == "oa"> + + <#else> + +
@@ -44,7 +43,7 @@
- + + + +