JayChou 2 weeks ago
commit fa223dbbd6
  1. 4
      jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/CommonConstant.java
  2. 25
      jeecg-boot/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/depadminlx/controller/DepadminlxController.java
  3. 5
      jeecg-boot/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/depadminlx/entity/Depadminlx.java
  4. 3
      jeecg-boot/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/depadminlx/mapper/DepadminlxMapper.java
  5. 1
      jeecg-boot/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/depadminlx/service/IDepadminlxService.java
  6. 7
      jeecg-boot/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/depadminlx/service/impl/DepadminlxServiceImpl.java
  7. 69
      jeecg-boot/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/depfile/controller/DepfileController.java
  8. 15
      jeecg-boot/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/depfile/entity/Depfile.java
  9. 66
      jeecg-boot/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/depsbncz/controller/DepsbnczController.java
  10. 11
      jeecg-boot/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/depsbncz/entity/Depsbncz.java
  11. 271
      jeecg-boot/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/project/controller/ProjectController.java
  12. 70
      jeecg-boot/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/project/dto/DepartExtDto2.java
  13. 2
      jeecg-boot/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/project/entity/Project.java
  14. 6
      jeecg-boot/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/project/service/impl/ProjectServiceImpl.java
  15. 162
      jeecg-boot/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/projectLog/controller/ProjectLogController.java
  16. 120
      jeecg-boot/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/projectLog/entity/ProjectLog.java
  17. 17
      jeecg-boot/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/projectLog/mapper/ProjectLogMapper.java
  18. 5
      jeecg-boot/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/projectLog/mapper/xml/ProjectLogMapper.xml
  19. 14
      jeecg-boot/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/projectLog/service/IProjectLogService.java
  20. 19
      jeecg-boot/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/projectLog/service/impl/ProjectLogServiceImpl.java
  21. 8
      jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/application-prod.yml
  22. 4
      jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/application-test.yml
  23. 6
      jeecg-boot/pom.xml
  24. 4
      jeecgboot-vue3/.env
  25. 6
      jeecgboot-vue3/.env.production
  26. 6
      jeecgboot-vue3/package.json
  27. 2
      jeecgboot-vue3/src/components/jeecg/AiChat/components/presetQuestion.vue
  28. 2
      jeecgboot-vue3/src/views/demo/page/desc/high/index.vue
  29. 6
      jeecgboot-vue3/src/views/depadminlx/DepadminlxList.vue
  30. 4
      jeecgboot-vue3/src/views/depadminlx/components/DepadminlxForm.vue
  31. 3
      jeecgboot-vue3/src/views/depfile/Depfile.api.ts
  32. 86
      jeecgboot-vue3/src/views/depfile/Depfile.data.ts
  33. 6
      jeecgboot-vue3/src/views/depfile/DepfileList.vue
  34. 14
      jeecgboot-vue3/src/views/depfile/components/DepfileForm.vue
  35. 5
      jeecgboot-vue3/src/views/depsbncz/Depsbncz.api.ts
  36. 69
      jeecgboot-vue3/src/views/depsbncz/Depsbncz.data.ts
  37. 6
      jeecgboot-vue3/src/views/depsbncz/DepsbnczList.vue
  38. 4
      jeecgboot-vue3/src/views/depsbncz/components/DepsbnczForm.vue
  39. 2
      jeecgboot-vue3/src/views/expert/firm/ExpertList.vue
  40. 116
      jeecgboot-vue3/src/views/projectApplication/kejigongguan/xiangmushu/FuJianDemo.vue
  41. 2
      jeecgboot-vue3/src/views/projectApplication/kejigongguan/xiangmushu/JeecgPdfView.vue
  42. 2
      jeecgboot-vue3/src/views/projectApplication/kejigongguan/xiangmushu/index.vue
  43. 159
      jeecgboot-vue3/src/views/projectApplication/kejigongguan/yusuanshu/DepartBaseInfoDemo.vue
  44. 130
      jeecgboot-vue3/src/views/projectApplication/kejigongguan/yusuanshu/NianDuYuSuanDemo.vue
  45. 2
      jeecgboot-vue3/src/views/projectApplication/kejigongguan/yusuanshu/index.vue
  46. 103
      jeecgboot-vue3/src/views/projectApplication/productAudit/Project.api.ts
  47. 421
      jeecgboot-vue3/src/views/projectApplication/productAudit/Project.data.ts
  48. 70
      jeecgboot-vue3/src/views/projectApplication/productAudit/components/ProjectForm.vue
  49. 76
      jeecgboot-vue3/src/views/projectApplication/productAudit/components/ProjectModal.vue
  50. 246
      jeecgboot-vue3/src/views/projectApplication/productAudit/projectAudit4CaiZhengList.vue
  51. 246
      jeecgboot-vue3/src/views/projectApplication/productAudit/projectAudit4FaRenList.vue
  52. 246
      jeecgboot-vue3/src/views/projectApplication/productAudit/projectAudit4KejijuList.vue
  53. 245
      jeecgboot-vue3/src/views/projectApplication/productAudit/projectAudit4QuXianList.vue
  54. 22
      jeecgboot-vue3/src/views/projectApplication/project/Project.api.ts
  55. 22
      jeecgboot-vue3/src/views/projectApplication/project/Project.data.ts
  56. 67
      jeecgboot-vue3/src/views/projectApplication/project/ProjectList.vue
  57. 64
      jeecgboot-vue3/src/views/projectLog/ProjectLog.api.ts
  58. 112
      jeecgboot-vue3/src/views/projectLog/ProjectLog.data.ts
  59. 190
      jeecgboot-vue3/src/views/projectLog/ProjectLogList.vue
  60. 26
      jeecgboot-vue3/src/views/projectLog/V20241104_1__menu_insert_ProjectLog.sql
  61. 70
      jeecgboot-vue3/src/views/projectLog/components/ProjectLogForm.vue
  62. 76
      jeecgboot-vue3/src/views/projectLog/components/ProjectLogModal.vue
  63. 2
      jeecgboot-vue3/src/views/sys/login/TokenLoginPage.vue

@ -88,9 +88,9 @@ public interface CommonConstant {
Integer SC_JEECG_NO_AUTHZ=510;
/** 登录用户Shiro权限缓存KEY前缀 */
public static String PREFIX_USER_SHIRO_CACHE = "shiro:cache:org.jeecg.config.shiro.ShiroRealm.authorizationCache:";
public static String PREFIX_USER_SHIRO_CACHE = "shiro_kjj:cache:org.jeecg.config.shiro.ShiroRealm.authorizationCache:";
/** 登录用户Token令牌缓存KEY前缀 */
String PREFIX_USER_TOKEN = "prefix_user_token:";
String PREFIX_USER_TOKEN = "prefix_user_kjj_token:";
// /** Token缓存时间:3600秒即一小时 */
// int TOKEN_EXPIRE_TIME = 3600;

@ -10,9 +10,12 @@ import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.shiro.SecurityUtils;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.system.query.QueryGenerator;
import org.jeecg.common.system.query.QueryRuleEnum;
import org.jeecg.common.system.vo.LoginUser;
import org.jeecg.common.util.oConvertUtils;
import org.jeecg.modules.demo.depadminlx.entity.Depadminlx;
import org.jeecg.modules.demo.depadminlx.service.IDepadminlxService;
@ -37,7 +40,6 @@ import com.alibaba.fastjson.JSON;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.jeecg.common.aspect.annotation.AutoLog;
import org.apache.shiro.authz.annotation.RequiresPermissions;
/**
* @Description: 单位基本情况联系人
@ -69,7 +71,9 @@ public class DepadminlxController extends JeecgController<Depadminlx, IDepadminl
@RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
@RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
HttpServletRequest req) {
LoginUser user= (LoginUser) SecurityUtils.getSubject().getPrincipal();
QueryWrapper<Depadminlx> queryWrapper = QueryGenerator.initQueryWrapper(depadminlx, req.getParameterMap());
queryWrapper.eq("userid",user.getId());
Page<Depadminlx> page = new Page<Depadminlx>(pageNo, pageSize);
IPage<Depadminlx> pageList = depadminlxService.page(page, queryWrapper);
return Result.OK(pageList);
@ -83,11 +87,19 @@ public class DepadminlxController extends JeecgController<Depadminlx, IDepadminl
*/
@AutoLog(value = "单位基本情况联系人-添加")
@ApiOperation(value="单位基本情况联系人-添加", notes="单位基本情况联系人-添加")
@RequiresPermissions("depadminlx:depadminlx:add")
@PostMapping(value = "/add")
public Result<String> add(@RequestBody Depadminlx depadminlx) {
depadminlxService.save(depadminlx);
return Result.OK("添加成功!");
LoginUser user= (LoginUser) SecurityUtils.getSubject().getPrincipal();
String depiid = depadminlxService.getdepid(user.getId());
List<Depadminlx> depadminlxes = depadminlxService.query().eq("depid",depiid).list();
if (depadminlxes.size()>0){
return Result.error("已经添加过了!");
}else {
depadminlx.setUserid(user.getId());
depadminlx.setDepid(depiid);
depadminlxService.save(depadminlx);
return Result.OK("添加成功!");
}
}
/**
@ -98,7 +110,6 @@ public class DepadminlxController extends JeecgController<Depadminlx, IDepadminl
*/
@AutoLog(value = "单位基本情况联系人-编辑")
@ApiOperation(value="单位基本情况联系人-编辑", notes="单位基本情况联系人-编辑")
@RequiresPermissions("depadminlx:depadminlx:edit")
@RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
public Result<String> edit(@RequestBody Depadminlx depadminlx) {
depadminlxService.updateById(depadminlx);
@ -113,7 +124,6 @@ public class DepadminlxController extends JeecgController<Depadminlx, IDepadminl
*/
@AutoLog(value = "单位基本情况联系人-通过id删除")
@ApiOperation(value="单位基本情况联系人-通过id删除", notes="单位基本情况联系人-通过id删除")
@RequiresPermissions("depadminlx:depadminlx:delete")
@DeleteMapping(value = "/delete")
public Result<String> delete(@RequestParam(name="id",required=true) String id) {
depadminlxService.removeById(id);
@ -128,7 +138,6 @@ public class DepadminlxController extends JeecgController<Depadminlx, IDepadminl
*/
@AutoLog(value = "单位基本情况联系人-批量删除")
@ApiOperation(value="单位基本情况联系人-批量删除", notes="单位基本情况联系人-批量删除")
@RequiresPermissions("depadminlx:depadminlx:deleteBatch")
@DeleteMapping(value = "/deleteBatch")
public Result<String> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
this.depadminlxService.removeByIds(Arrays.asList(ids.split(",")));
@ -158,7 +167,6 @@ public class DepadminlxController extends JeecgController<Depadminlx, IDepadminl
* @param request
* @param depadminlx
*/
@RequiresPermissions("depadminlx:depadminlx:exportXls")
@RequestMapping(value = "/exportXls")
public ModelAndView exportXls(HttpServletRequest request, Depadminlx depadminlx) {
return super.exportXls(request, depadminlx, Depadminlx.class, "单位基本情况联系人");
@ -171,7 +179,6 @@ public class DepadminlxController extends JeecgController<Depadminlx, IDepadminl
* @param response
* @return
*/
@RequiresPermissions("depadminlx:depadminlx:importExcel")
@RequestMapping(value = "/importExcel", method = RequestMethod.POST)
public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
return super.importExcel(request, response, Depadminlx.class);

@ -98,4 +98,9 @@ public class Depadminlx implements Serializable {
@Dict(dictTable = "sys_depart", dicText = "depart_name", dicCode = "id")
@ApiModelProperty(value = "部门")
private String depid;
/**用户id*/
@Excel(name = "用户id", width = 15)
@ApiModelProperty(value = "用户id")
private java.lang.String userid;
}

@ -3,6 +3,7 @@ package org.jeecg.modules.demo.depadminlx.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.jeecg.modules.demo.depadminlx.entity.Depadminlx;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
@ -14,4 +15,6 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
*/
public interface DepadminlxMapper extends BaseMapper<Depadminlx> {
@Select("select dep_id from sys_user_depart where user_id=#{id}")
String getdepid(String id);
}

@ -11,4 +11,5 @@ import com.baomidou.mybatisplus.extension.service.IService;
*/
public interface IDepadminlxService extends IService<Depadminlx> {
String getdepid(String id);
}

@ -3,6 +3,7 @@ package org.jeecg.modules.demo.depadminlx.service.impl;
import org.jeecg.modules.demo.depadminlx.entity.Depadminlx;
import org.jeecg.modules.demo.depadminlx.mapper.DepadminlxMapper;
import org.jeecg.modules.demo.depadminlx.service.IDepadminlxService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@ -16,4 +17,10 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@Service
public class DepadminlxServiceImpl extends ServiceImpl<DepadminlxMapper, Depadminlx> implements IDepadminlxService {
@Autowired
private DepadminlxMapper depadminlxMapper;
@Override
public String getdepid(String id) {
return depadminlxMapper.getdepid(id);
}
}

@ -1,5 +1,7 @@
package org.jeecg.modules.demo.depfile.controller;
import java.io.File;
import java.net.URL;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
@ -10,10 +12,15 @@ import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.apache.shiro.SecurityUtils;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.system.query.QueryGenerator;
import org.jeecg.common.system.query.QueryRuleEnum;
import org.jeecg.common.system.vo.LoginUser;
import org.jeecg.common.util.oConvertUtils;
import org.jeecg.modules.demo.depadminlx.service.IDepadminlxService;
import org.jeecg.modules.demo.depfile.entity.Depfile;
import org.jeecg.modules.demo.depfile.service.IDepfileService;
@ -22,6 +29,8 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.modules.system.entity.SysDepart;
import org.jeecg.modules.system.service.ISysDepartService;
import org.jeecgframework.poi.excel.ExcelImportUtil;
import org.jeecgframework.poi.excel.def.NormalExcelConstants;
import org.jeecgframework.poi.excel.entity.ExportParams;
@ -37,7 +46,6 @@ import com.alibaba.fastjson.JSON;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.jeecg.common.aspect.annotation.AutoLog;
import org.apache.shiro.authz.annotation.RequiresPermissions;
/**
* @Description: 单位技术研究资质情况
@ -53,6 +61,12 @@ public class DepfileController extends JeecgController<Depfile, IDepfileService>
@Autowired
private IDepfileService depfileService;
@Autowired
private IDepadminlxService depadminlxService;
@Autowired
private ISysDepartService iSysDepartService;
/**
* 分页列表查询
*
@ -69,6 +83,29 @@ public class DepfileController extends JeecgController<Depfile, IDepfileService>
@RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
@RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
HttpServletRequest req) {
LoginUser user= (LoginUser) SecurityUtils.getSubject().getPrincipal();
QueryWrapper<Depfile> queryWrapper = QueryGenerator.initQueryWrapper(depfile, req.getParameterMap());
queryWrapper.eq("userid",user.getId());
Page<Depfile> page = new Page<Depfile>(pageNo, pageSize);
IPage<Depfile> pageList = depfileService.page(page, queryWrapper);
return Result.OK(pageList);
}
/**
* @description: 申报书-单位管理员上传附件查询
* @param: [depfile, pageNo, pageSize, req]
* @return: org.jeecg.common.api.vo.Result<com.baomidou.mybatisplus.core.metadata.IPage<org.jeecg.modules.demo.depfile.entity.Depfile>>
* @author: z.h.c
* @date: 24/11/1 16:38
*/
@ApiOperation(value="申报书-单位管理员上传附件查询", notes="申报书-单位管理员上传附件查询")
@GetMapping(value = "/getDepFileList")
public Result<IPage<Depfile>> getDepFileList(Depfile depfile,
@RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
@RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
HttpServletRequest req) {
SysDepart sysDepart = iSysDepartService.getOne(new LambdaQueryWrapper<SysDepart>().eq(SysDepart::getOrgCode, depfile.getDepid()));
depfile.setDepid(sysDepart.getId());
QueryWrapper<Depfile> queryWrapper = QueryGenerator.initQueryWrapper(depfile, req.getParameterMap());
Page<Depfile> page = new Page<Depfile>(pageNo, pageSize);
IPage<Depfile> pageList = depfileService.page(page, queryWrapper);
@ -83,9 +120,16 @@ public class DepfileController extends JeecgController<Depfile, IDepfileService>
*/
@AutoLog(value = "单位技术研究资质情况-添加")
@ApiOperation(value="单位技术研究资质情况-添加", notes="单位技术研究资质情况-添加")
@RequiresPermissions("depfile:depfile:add")
@PostMapping(value = "/add")
public Result<String> add(@RequestBody Depfile depfile) {
LoginUser user= (LoginUser) SecurityUtils.getSubject().getPrincipal();
depfile.setUserid(user.getId());
String depiid = depadminlxService.getdepid(user.getId());
depfile.setDepid(depiid);
String extension = getFileExtensionFromUrl(depfile.getUpfile());
System.out.println(depfile.getUpfile());
System.out.println(depfile.getUpfile());
depfile.setFilehz(extension);
depfileService.save(depfile);
return Result.OK("添加成功!");
}
@ -98,9 +142,12 @@ public class DepfileController extends JeecgController<Depfile, IDepfileService>
*/
@AutoLog(value = "单位技术研究资质情况-编辑")
@ApiOperation(value="单位技术研究资质情况-编辑", notes="单位技术研究资质情况-编辑")
@RequiresPermissions("depfile:depfile:edit")
@RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
public Result<String> edit(@RequestBody Depfile depfile) {
String extension = getFileExtensionFromUrl(depfile.getUpfile());
depfile.setFilehz(extension);
System.out.println(depfile.getUpfile());
System.out.println(depfile.getUpfile());
depfileService.updateById(depfile);
return Result.OK("编辑成功!");
}
@ -113,7 +160,6 @@ public class DepfileController extends JeecgController<Depfile, IDepfileService>
*/
@AutoLog(value = "单位技术研究资质情况-通过id删除")
@ApiOperation(value="单位技术研究资质情况-通过id删除", notes="单位技术研究资质情况-通过id删除")
@RequiresPermissions("depfile:depfile:delete")
@DeleteMapping(value = "/delete")
public Result<String> delete(@RequestParam(name="id",required=true) String id) {
depfileService.removeById(id);
@ -128,7 +174,6 @@ public class DepfileController extends JeecgController<Depfile, IDepfileService>
*/
@AutoLog(value = "单位技术研究资质情况-批量删除")
@ApiOperation(value="单位技术研究资质情况-批量删除", notes="单位技术研究资质情况-批量删除")
@RequiresPermissions("depfile:depfile:deleteBatch")
@DeleteMapping(value = "/deleteBatch")
public Result<String> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
this.depfileService.removeByIds(Arrays.asList(ids.split(",")));
@ -158,7 +203,6 @@ public class DepfileController extends JeecgController<Depfile, IDepfileService>
* @param request
* @param depfile
*/
@RequiresPermissions("depfile:depfile:exportXls")
@RequestMapping(value = "/exportXls")
public ModelAndView exportXls(HttpServletRequest request, Depfile depfile) {
return super.exportXls(request, depfile, Depfile.class, "单位技术研究资质情况");
@ -171,10 +215,17 @@ public class DepfileController extends JeecgController<Depfile, IDepfileService>
* @param response
* @return
*/
@RequiresPermissions("depfile:depfile:importExcel")
@RequestMapping(value = "/importExcel", method = RequestMethod.POST)
public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
return super.importExcel(request, response, Depfile.class);
}
}
}
public static String getFileExtensionFromUrl(String fileUrl) {
File file = new File(fileUrl);
String fileName = file.getName();
String extension = fileName.substring(fileName.lastIndexOf(".") + 1);
return extension;
}
}

@ -80,4 +80,19 @@ public class Depfile implements Serializable {
@Excel(name = "文件", width = 15)
@ApiModelProperty(value = "文件")
private String upfile;
/**用户id*/
@Excel(name = "用户id", width = 15)
@ApiModelProperty(value = "用户id")
private java.lang.String userid;
/**文件后缀*/
@Excel(name = "文件后缀", width = 15)
@ApiModelProperty(value = "文件后缀")
private java.lang.String filehz;
/**文件类型*/
@Excel(name = "文件类型", width = 15, dicCode = "filetext")
@Dict(dicCode = "filetext")
@ApiModelProperty(value = "文件类型")
private java.lang.String filelx;
}

@ -1,5 +1,6 @@
package org.jeecg.modules.demo.depsbncz.controller;
import java.time.LocalDate;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
@ -10,10 +11,17 @@ import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.apache.shiro.SecurityUtils;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.system.query.QueryGenerator;
import org.jeecg.common.system.query.QueryRuleEnum;
import org.jeecg.common.system.vo.LoginUser;
import org.jeecg.common.util.oConvertUtils;
import org.jeecg.modules.demo.annual.entity.Annual;
import org.jeecg.modules.demo.annual.service.IAnnualService;
import org.jeecg.modules.demo.depadminlx.service.IDepadminlxService;
import org.jeecg.modules.demo.depsbncz.entity.Depsbncz;
import org.jeecg.modules.demo.depsbncz.service.IDepsbnczService;
@ -22,6 +30,8 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.modules.system.entity.SysDepart;
import org.jeecg.modules.system.service.ISysDepartService;
import org.jeecgframework.poi.excel.ExcelImportUtil;
import org.jeecgframework.poi.excel.def.NormalExcelConstants;
import org.jeecgframework.poi.excel.entity.ExportParams;
@ -37,7 +47,7 @@ import com.alibaba.fastjson.JSON;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.jeecg.common.aspect.annotation.AutoLog;
import org.apache.shiro.authz.annotation.RequiresPermissions;
/**
* @Description: 上年度()主要财务数据
@ -52,6 +62,12 @@ import org.apache.shiro.authz.annotation.RequiresPermissions;
public class DepsbnczController extends JeecgController<Depsbncz, IDepsbnczService> {
@Autowired
private IDepsbnczService depsbnczService;
@Autowired
private IDepadminlxService depadminlxService;
@Autowired
private IAnnualService annualService;
@Autowired
private ISysDepartService iSysDepartService;
/**
* 分页列表查询
@ -69,12 +85,28 @@ public class DepsbnczController extends JeecgController<Depsbncz, IDepsbnczServi
@RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
@RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
HttpServletRequest req) {
LoginUser user= (LoginUser) SecurityUtils.getSubject().getPrincipal();
QueryWrapper<Depsbncz> queryWrapper = QueryGenerator.initQueryWrapper(depsbncz, req.getParameterMap());
queryWrapper.eq("userid",user.getId());
Page<Depsbncz> page = new Page<Depsbncz>(pageNo, pageSize);
IPage<Depsbncz> pageList = depsbnczService.page(page, queryWrapper);
return Result.OK(pageList);
}
@ApiOperation(value="预算书-部门基本情况-上年度(末)主要财务数据", notes="预算书-部门基本情况-上年度(末)主要财务数据")
@GetMapping(value = "/getBydepid")
public Result<IPage<Depsbncz>> getBydepid(Depsbncz depsbncz,
@RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
@RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
HttpServletRequest req) {
SysDepart sysDepart = iSysDepartService.getOne(new LambdaQueryWrapper<SysDepart>().eq(SysDepart::getOrgCode, depsbncz.getDepid()));
depsbncz.setDepid(sysDepart.getId());
QueryWrapper<Depsbncz> queryWrapper = QueryGenerator.initQueryWrapper(depsbncz, req.getParameterMap());
Page<Depsbncz> page = new Page<Depsbncz>(pageNo, pageSize);
IPage<Depsbncz> pageList = depsbnczService.page(page, queryWrapper);
return Result.OK(pageList);
}
/**
* 添加
*
@ -83,11 +115,25 @@ public class DepsbnczController extends JeecgController<Depsbncz, IDepsbnczServi
*/
@AutoLog(value = "上年度(末)主要财务数据-添加")
@ApiOperation(value="上年度(末)主要财务数据-添加", notes="上年度(末)主要财务数据-添加")
@RequiresPermissions("depsbncz:depsbncz:add")
@PostMapping(value = "/add")
public Result<String> add(@RequestBody Depsbncz depsbncz) {
depsbnczService.save(depsbncz);
return Result.OK("添加成功!");
LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
depsbncz.setUserid(user.getId());
String depiid = depadminlxService.getdepid(user.getId());
// 获取当前日期
LocalDate currentDate = LocalDate.now();
// 获取当前年份并直接转换为字符串
String currentYearString = String.valueOf(currentDate.getYear());
Annual annual = annualService.query().eq("annual_name",currentYearString).one();
List<Depsbncz> depsbnczs=depsbnczService.query().eq("annualid",annual.getId()).eq("depid",depiid).list();
if (depsbnczs.size()>0){
return Result.error("本年度已经添加过了");
}else {
depsbncz.setAnnualid(annual.getId());
depsbncz.setDepid(depiid);
depsbnczService.save(depsbncz);
return Result.OK("添加成功!");
}
}
/**
@ -98,7 +144,6 @@ public class DepsbnczController extends JeecgController<Depsbncz, IDepsbnczServi
*/
@AutoLog(value = "上年度(末)主要财务数据-编辑")
@ApiOperation(value="上年度(末)主要财务数据-编辑", notes="上年度(末)主要财务数据-编辑")
@RequiresPermissions("depsbncz:depsbncz:edit")
@RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
public Result<String> edit(@RequestBody Depsbncz depsbncz) {
depsbnczService.updateById(depsbncz);
@ -113,7 +158,6 @@ public class DepsbnczController extends JeecgController<Depsbncz, IDepsbnczServi
*/
@AutoLog(value = "上年度(末)主要财务数据-通过id删除")
@ApiOperation(value="上年度(末)主要财务数据-通过id删除", notes="上年度(末)主要财务数据-通过id删除")
@RequiresPermissions("depsbncz:depsbncz:delete")
@DeleteMapping(value = "/delete")
public Result<String> delete(@RequestParam(name="id",required=true) String id) {
depsbnczService.removeById(id);
@ -128,7 +172,6 @@ public class DepsbnczController extends JeecgController<Depsbncz, IDepsbnczServi
*/
@AutoLog(value = "上年度(末)主要财务数据-批量删除")
@ApiOperation(value="上年度(末)主要财务数据-批量删除", notes="上年度(末)主要财务数据-批量删除")
@RequiresPermissions("depsbncz:depsbncz:deleteBatch")
@DeleteMapping(value = "/deleteBatch")
public Result<String> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
this.depsbnczService.removeByIds(Arrays.asList(ids.split(",")));
@ -152,13 +195,19 @@ public class DepsbnczController extends JeecgController<Depsbncz, IDepsbnczServi
return Result.OK(depsbncz);
}
@ApiOperation(value="上年度(末)主要财务数据-通过depid查询", notes="上年度(末)主要财务数据-通过depid查询")
@GetMapping(value = "/queryBydepid/{depid}")
public Result<List<Depsbncz>> queryBydepid(@PathVariable("depid") String depid) {
List<Depsbncz> list = depsbnczService.list(new LambdaQueryWrapper<Depsbncz>().eq(Depsbncz::getDepid, depid));
return Result.OK(list);
}
/**
* 导出excel
*
* @param request
* @param depsbncz
*/
@RequiresPermissions("depsbncz:depsbncz:exportXls")
@RequestMapping(value = "/exportXls")
public ModelAndView exportXls(HttpServletRequest request, Depsbncz depsbncz) {
return super.exportXls(request, depsbncz, Depsbncz.class, "上年度(末)主要财务数据");
@ -171,7 +220,6 @@ public class DepsbnczController extends JeecgController<Depsbncz, IDepsbnczServi
* @param response
* @return
*/
@RequiresPermissions("depsbncz:depsbncz:importExcel")
@RequestMapping(value = "/importExcel", method = RequestMethod.POST)
public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
return super.importExcel(request, response, Depsbncz.class);

@ -102,4 +102,15 @@ public class Depsbncz implements Serializable {
@Excel(name = "纳税总额", width = 15)
@ApiModelProperty(value = "纳税总额")
private String nsze;
/**用户id*/
@Excel(name = "用户id", width = 15)
@ApiModelProperty(value = "用户id")
private java.lang.String userid;
/**年度*/
@Excel(name = "年度", width = 15, dictTable = "annual", dicText = "annual_name", dicCode = "id")
@Dict(dictTable = "annual", dicText = "annual_name", dicCode = "id")
@ApiModelProperty(value = "年度")
private java.lang.String annualid;
}

@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.aspect.annotation.AutoLog;
@ -17,13 +18,19 @@ import org.jeecg.common.system.base.controller.JeecgController;
import org.jeecg.common.system.query.QueryGenerator;
import org.jeecg.common.system.query.QueryRuleEnum;
import org.jeecg.common.system.vo.DictModel;
import org.jeecg.common.system.vo.LoginUser;
import org.jeecg.modules.demo.depadminlx.entity.Depadminlx;
import org.jeecg.modules.demo.depadminlx.service.IDepadminlxService;
import org.jeecg.modules.demo.departext.entity.DepartExt;
import org.jeecg.modules.demo.departext.service.IDepartExtService;
import org.jeecg.modules.demo.project.dto.BasicInfoDto;
import org.jeecg.modules.demo.project.dto.DepartExtDto;
import org.jeecg.modules.demo.project.dto.DepartExtDto2;
import org.jeecg.modules.demo.project.dto.ProjectShenBaoDto;
import org.jeecg.modules.demo.project.entity.Project;
import org.jeecg.modules.demo.project.service.IProjectService;
import org.jeecg.modules.demo.projectLog.entity.ProjectLog;
import org.jeecg.modules.demo.projectLog.service.IProjectLogService;
import org.jeecg.modules.demo.projectType.entity.ProjectType;
import org.jeecg.modules.demo.projectType.service.IProjectTypeService;
import org.jeecg.modules.demo.userext.entity.UserExt;
@ -41,10 +48,7 @@ import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
/**
* @Description: 项目表
@ -78,6 +82,12 @@ public class ProjectController extends JeecgController<Project, IProjectService>
@Autowired
private SysBaseApiImpl sysBaseApi;
@Autowired
private IDepadminlxService iDepadminlxService;
@Autowired
private IProjectLogService iProjectLogService;
/**
* 分页列表查询
*
@ -90,6 +100,7 @@ public class ProjectController extends JeecgController<Project, IProjectService>
//@AutoLog(value = "项目表-分页列表查询")
@ApiOperation(value = "项目表-分页列表查询", notes = "项目表-分页列表查询")
@GetMapping(value = "/list")
// @PermissionData(pageComponent = "projectApplication/project/ProjectList")
public Result<IPage<Project>> queryPageList(Project project,
@RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
@RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
@ -100,12 +111,81 @@ public class ProjectController extends JeecgController<Project, IProjectService>
customeRuleMap.put("projectDomain", QueryRuleEnum.LIKE_WITH_OR);
customeRuleMap.put("projectStatus", QueryRuleEnum.LIKE_WITH_OR);
customeRuleMap.put("budgetStatus", QueryRuleEnum.LIKE_WITH_OR);
LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
if ("shenbaoren_role".equals(loginUser.getRoleCode())) {
project.setCreateBy(loginUser.getUsername());
}
QueryWrapper<Project> queryWrapper = QueryGenerator.initQueryWrapper(project, req.getParameterMap(), customeRuleMap);
Page<Project> page = new Page<Project>(pageNo, pageSize);
IPage<Project> pageList = projectService.page(page, queryWrapper);
return Result.OK(pageList);
}
/**
* @description:
* //('科技主管部门待提交', '1');
* //('科技主管部门已提交', '2');
* //('不受理', '3');
* //('已受理', '4');
* //('申请人待提交', '5');
* //('申请单位待提交', '6');
* //('市科技局待提交', '7');
* //('市科技局已提交', '8');
* //('财政主管理部门待审核', '9');
* //('财政主管理部门审核通过', '10');
* @param: [project, pageNo, pageSize, req]
* @return: org.jeecg.common.api.vo.Result<com.baomidou.mybatisplus.core.metadata.IPage < org.jeecg.modules.demo.project.entity.Project>>
* @author: z.h.c
* @date: 24/11/5 16:25
*/
@ApiOperation(value = "项目表-分页列表查询", notes = "项目表-分页列表查询")
@GetMapping(value = "/list4Audit")
// @PermissionData(pageComponent = "projectApplication/productAudit/project4AuditList")
public Result<IPage<Project>> queryPageList2(Project project,
@RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
@RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
HttpServletRequest req) {
// 自定义查询规则
Map<String, QueryRuleEnum> customeRuleMap = new HashMap<>();
// 自定义多选的查询规则为:LIKE_WITH_OR
customeRuleMap.put("projectDomain", QueryRuleEnum.LIKE_WITH_OR);
customeRuleMap.put("projectStatus", QueryRuleEnum.LIKE_WITH_OR);
customeRuleMap.put("budgetStatus", QueryRuleEnum.LIKE_WITH_OR);
LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
QueryWrapper<Project> queryWrapper = QueryGenerator.initQueryWrapper(project, req.getParameterMap(), customeRuleMap);
Page<Project> page = new Page<Project>(pageNo, pageSize);
//('科技主管部门待提交', '1');
//('不受理', '3');
//('已受理', '4');
//('申请人待提交', '5');
//('申请单位待提交', '6');
//('市科技局待提交', '7');
//('市科技局已提交', '8');
//('财政主管理部门待审核', '9');
//('财政主管理部门审核通过', '10');
//申请单位数据
if ("faren_admin".equals(loginUser.getRoleCode())) {
queryWrapper.eq("sys_org_code", loginUser.getOrgCode());
queryWrapper.eq("project_status", 6);
}
// 区/县管理员数据
if ("quxian_admin".equals(loginUser.getRoleCode())) {
queryWrapper.likeRight("sys_org_code", loginUser.getOrgCode());
queryWrapper.eq("project_status", 1);
}
if ("kejiju_admin".equals(loginUser.getRoleCode())) {
queryWrapper.in("project_status", 7, 8);
}
if ("caizheng_admin".equals(loginUser.getRoleCode())) {
queryWrapper.in("budget_status", 9, 10);
}
IPage<Project> pageList = projectService.page(page, queryWrapper);
return Result.OK(pageList);
}
@ApiOperation(value = "项目表-根据id查询", notes = "项目表-根据id查询")
@GetMapping(value = "/getById")
public Result<Project> getById(Project param, HttpServletRequest req) {
@ -160,7 +240,7 @@ public class ProjectController extends JeecgController<Project, IProjectService>
BeanUtils.copyProperties(userExt, basicInfoDto);
BeanUtils.copyProperties(project, basicInfoDto);
basicInfoDto.setRealName(sysUser.getRealname());
basicInfoDto.setProjectTime(DateUtils.formatDate(project.getStartTime()) +"——"+DateUtils.formatDate(project.getEndTime()));
basicInfoDto.setProjectTime(DateUtils.formatDate(project.getStartTime()) + "——" + DateUtils.formatDate(project.getEndTime()));
return Result.OK(basicInfoDto);
}
@ -196,17 +276,53 @@ public class ProjectController extends JeecgController<Project, IProjectService>
ProjectType projectType = iProjectTypeService.getById(project.getProjectTypeid());
dto.setAnnualName(projectType.getAnnualName());
List<DictModel> dictModels = sysBaseApi.queryDictItemsByCode("depart_type");
if(ObjectUtil.isNotEmpty(dictModels)){
dictModels.forEach(e->{
if(e.getValue().equals(dto.getType())){
if (ObjectUtil.isNotEmpty(dictModels)) {
dictModels.forEach(e -> {
if (e.getValue().equals(dto.getType())) {
dto.setType(e.getText());
}
});
}
List<DictModel> dictModels2 = sysBaseApi.queryDictItemsByCode("depart_category");
if (ObjectUtil.isNotEmpty(dictModels2)) {
dictModels2.forEach(d -> {
if (d.getValue().equals(dto.getOrgCategory())) {
dto.setOrgCategory(d.getText());
}
});
}
return Result.OK(dto);
}
@ApiOperation(value = "预算书-部门基本情况-部门信息", notes = "预算书-部门基本情况-部门信息")
@GetMapping(value = "/getDepartDtoInfo")
public Result<DepartExtDto2> getDepartDtoInfo(Project para, HttpServletRequest req) {
Project project = projectService.getById(para.getId());
SysUser sysUser = iSysUserService.getById(project.getProjectCharger());
SysDepart sysDepart = iSysDepartService.getOne(new LambdaQueryWrapper<SysDepart>().eq(SysDepart::getOrgCode, sysUser.getOrgCode()));
DepartExt departExt = iDepartExtService.getOne(new LambdaQueryWrapper<DepartExt>()
.eq(DepartExt::getDepartId, sysDepart.getId())
.eq(DepartExt::getProjectId, para.getId())
);
Depadminlx depadminlx = iDepadminlxService.getOne(new LambdaQueryWrapper<Depadminlx>().eq(Depadminlx::getDepid, project.getSysOrgCode()));
DepartExtDto2 dto = new DepartExtDto2();
BeanUtils.copyProperties(sysDepart, dto);
BeanUtils.copyProperties(departExt, dto);
BeanUtils.copyProperties(depadminlx, dto);
ProjectType projectType = iProjectTypeService.getById(project.getProjectTypeid());
dto.setAnnualName(projectType.getAnnualName());
List<DictModel> dictModels = sysBaseApi.queryDictItemsByCode("depart_type");
if (ObjectUtil.isNotEmpty(dictModels)) {
dictModels.forEach(e -> {
if (e.getValue().equals(dto.getType())) {
dto.setType(e.getText());
}
});
}
List<DictModel> dictModels2 = sysBaseApi.queryDictItemsByCode("depart_category");
if(ObjectUtil.isNotEmpty(dictModels2)){
dictModels2.forEach(d->{
if(d.getValue().equals(dto.getOrgCategory())){
if (ObjectUtil.isNotEmpty(dictModels2)) {
dictModels2.forEach(d -> {
if (d.getValue().equals(dto.getOrgCategory())) {
dto.setOrgCategory(d.getText());
}
});
@ -229,11 +345,142 @@ public class ProjectController extends JeecgController<Project, IProjectService>
return Result.OK("添加成功!");
}
/**
* @description: 向上级提交项目
* @param: [project]
* @return: org.jeecg.common.api.vo.Result<java.lang.String>
* @author: z.h.c
* @date: 24/11/4 16:12
*/
@AutoLog(value = "项目表-上级管理员审核通过")
@ApiOperation(value = "项目表-审核通过", notes = "项目表-审核通过")
@PostMapping(value = "/submitApply")
public Result<String> submitApply(@RequestBody Project project) {
//('科技主管部门待提交', '1');
//('科技主管部门已提交', '2');
//('不受理', '3');
//('已受理', '4');
//('申请人待提交', '5');
//('申请单位待提交', '6');
//('市科技局待提交', '7');
//('市科技局已提交', '8');
//('财政主管理部门待审核', '9');
//('财政主管理部门审核通过', '10');
Project project1 = projectService.getById(project.getId());
LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
ProjectLog log = new ProjectLog();
log.setOperatorName(loginUser.getRealname());
log.setOperatorId(loginUser.getId());
log.setProjectId(project.getId());
log.setProjectName(project1.getProjectName());
log.setOperationTime(new Date());
//申报人提交,并向上级提交->申请单位待提交
if ("shenbaoren_role".equals(loginUser.getRoleCode())) {
project.setProjectStatus("6");
//预算书和项目书用同一种状态
project.setBudgetStatus("6");
log.setProjectStatus("6");
log.setBudgetStatus("6");
log.setOperationMark("申请人提交项目书,申请人提交预算书");
}
//申请单位审核通过,并向上级提交->科技主管部门待提交(区/县管理员)
if ("faren_admin".equals(loginUser.getRoleCode())) {
project.setProjectStatus("1");
//预算书和项目书用同一种状态
project.setBudgetStatus("1");
log.setProjectStatus("1");
log.setBudgetStatus("1");
log.setOperationMark("申请单位提交项目书,申请单位提交预算书");
}
//区/县管理员审核通过,并向上级提交->市科技局处理
if ("quxian_admin".equals(loginUser.getRoleCode())) {
project.setProjectStatus("7");
//预算书和项目书用同一种状态
project.setBudgetStatus("7");
log.setProjectStatus("7");
log.setBudgetStatus("7");
log.setOperationMark("科技主管部门提交项目书,科技主管部门提交预算书");
}
//市科技局通过-》财政管理员处理
if ("kejiju_admin".equals(loginUser.getRoleCode())) {
project.setProjectStatus("8");
//预算书和项目书用同一种状态
project.setBudgetStatus("9");
log.setProjectStatus("8");
log.setBudgetStatus("9");
log.setOperationMark("市科技局已提交,待财政主管部门审核");
}
//市科技局通过-》财政管理员处理
if ("caizheng_admin".equals(loginUser.getRoleCode())) {
// project.setProjectStatus("10");
project.setBudgetStatus("10");
log.setBudgetStatus("10");
log.setOperationMark("财政主管部门审核通过");
}
project.setUpdateTime(new Date());
projectService.updateById(project);
iProjectLogService.save(log);
return Result.OK("操作成功!");
}
/**
* @description: (申请单位待提交)状态申报人可以取回项目
* @param: [project]
* @return: org.jeecg.common.api.vo.Result<java.lang.String>
* @author: z.h.c
* @date: 24/11/5 11:00
*/
@AutoLog(value = "项目表-申报人取回项目/审核取回")
@ApiOperation(value = "项目表-申报人取回项目/审核取回", notes = "项目表-申报人取回项目/审核取回")
@PostMapping(value = "/rollbackProject")
public Result<String> rollbackProject(@RequestBody Project project) {
//('科技主管部门待提交', '1');
//('科技主管部门已提交', '2');
//('不受理', '3');
//('已受理', '4');
//('申请人待提交', '5');
//('申请单位待提交', '6');
//('市科技局待提交', '7');
//('市科技局已提交', '8');
//('财政主管理部门待审核', '9');
//('财政主管理部门审核通过', '10');
LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
project.setProjectStatus("5");
//预算书和项目书用同一种状态
project.setBudgetStatus("5");
project.setUpdateTime(new Date());
project.setUpdateBy(loginUser.getRealname());
projectService.updateById(project);
Project project1 = projectService.getById(project.getId());
ProjectLog log = new ProjectLog();
log.setOperatorName(loginUser.getRealname());
log.setOperatorId(loginUser.getId());
log.setProjectId(project.getId());
log.setProjectName(project1.getProjectName());
log.setOperationTime(new Date());
log.setProjectStatus("5");
log.setBudgetStatus("5");
log.setOperationMark("审核取回");
iProjectLogService.save(log);
return Result.OK("操作成功!");
}
@AutoLog(value = "新增项目审报")
@ApiOperation(value = "新增项目审报", notes = "新增项目审报")
@PostMapping(value = "/save4shenbao")
public Result<String> save4shenbao(@RequestBody ProjectShenBaoDto dto) {
long count = projectService.count(new LambdaQueryWrapper<Project>().eq(Project::getProjectTypeid, dto.getProjectTypeid()));
LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
long count = projectService.count(new LambdaQueryWrapper<Project>()
.eq(Project::getProjectTypeid, dto.getProjectTypeid())
.eq(Project::getSysOrgCode, loginUser.getOrgId()));
if (count > 0) {
throw new JeecgBootException("该项目类型,当年已填报,不能重复填报!");
}

@ -0,0 +1,70 @@
package org.jeecg.modules.demo.project.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.jeecgframework.poi.excel.annotation.Excel;
/**
* @Description: TODO
* @Author: Z.H.C
* @CreateTime: 2024-10-24 11:09
* @Version: 1.0
*/
@Data
public class DepartExtDto2 extends DepartExtDto {
@Excel(name = "编制数", width = 15)
@ApiModelProperty(value = "编制数")
private String bzs;
/**
* 在职职工人数:
*/
@Excel(name = "在职职工人数:", width = 15)
@ApiModelProperty(value = "在职职工人数:")
private String zzzgrs;
/**
* 中级职称以上研究人员数
*/
@Excel(name = "中级职称以上研究人员数", width = 15)
@ApiModelProperty(value = "中级职称以上研究人员数")
private String zjzcysyjrys;
/**
* 单位联系人姓名
*/
@Excel(name = "单位联系人姓名", width = 15)
@ApiModelProperty(value = "单位联系人姓名")
private String dwlxrxm;
/**
* 单位联系人职称
*/
@Excel(name = "单位联系人职称", width = 15)
@ApiModelProperty(value = "单位联系人职称")
private String dwlxrzc;
/**
* 单位联系人职务
*/
@Excel(name = "单位联系人职务", width = 15)
@ApiModelProperty(value = "单位联系人职务")
private String dwlxrzw;
/**
* 单位联系人电话
*/
@Excel(name = "单位联系人电话", width = 15)
@ApiModelProperty(value = "单位联系人电话")
private String dwlxrdh;
/**
* 单位联系人手机
*/
@Excel(name = "单位联系人手机", width = 15)
@ApiModelProperty(value = "单位联系人手机")
private String dwlxrsj;
/**
* 单位联系人邮箱
*/
@Excel(name = "单位联系人邮箱", width = 15)
@ApiModelProperty(value = "单位联系人邮箱")
private String dwlxryx;
}

@ -65,7 +65,7 @@ public class Project implements Serializable {
/**
* 所属部门
*/
@Dict(dictTable = "sys_depart", dicText = "depart_name", dicCode = "id")
@Dict(dictTable = "sys_depart", dicText = "depart_name", dicCode = "org_code")
@ApiModelProperty(value = "所属部门")
private String sysOrgCode;
/**

@ -64,13 +64,13 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
// BeanUtils.copyProperties(dto, sysUser);
BeanUtils.copyProperties(dto, userExt);
BeanUtils.copyProperties(dto, project);
project.setSysOrgCode(loginUser.getOrgId());
project.setSysOrgCode(loginUser.getOrgCode());
//负责人
project.setProjectCharger(loginUser.getId());
//申请人待提交
project.setProjectStatus("5");
// 预算书不存在
project.setBudgetStatus("10");
// 申请人待提交
project.setBudgetStatus("1");
this.save(project);
userExt.setUserId(loginUser.getId());

@ -0,0 +1,162 @@
package org.jeecg.modules.demo.projectLog.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.aspect.annotation.AutoLog;
import org.jeecg.common.system.base.controller.JeecgController;
import org.jeecg.common.system.query.QueryGenerator;
import org.jeecg.modules.demo.projectLog.entity.ProjectLog;
import org.jeecg.modules.demo.projectLog.service.IProjectLogService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Arrays;
/**
* @Description: 项目操作日志
* @Author: jeecg-boot
* @Date: 2024-11-04
* @Version: V1.0
*/
@Api(tags = "项目操作日志")
@RestController
@RequestMapping("/projectLog/projectLog")
@Slf4j
public class ProjectLogController extends JeecgController<ProjectLog, IProjectLogService> {
@Autowired
private IProjectLogService projectLogService;
/**
* 分页列表查询
*
* @param projectLog
* @param pageNo
* @param pageSize
* @param req
* @return
*/
//@AutoLog(value = "项目操作日志-分页列表查询")
@ApiOperation(value = "项目操作日志-分页列表查询", notes = "项目操作日志-分页列表查询")
@GetMapping(value = "/list")
public Result<IPage<ProjectLog>> queryPageList(ProjectLog projectLog,
@RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
@RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
HttpServletRequest req) {
QueryWrapper<ProjectLog> queryWrapper = QueryGenerator.initQueryWrapper(projectLog, req.getParameterMap());
Page<ProjectLog> page = new Page<ProjectLog>(pageNo, pageSize);
IPage<ProjectLog> pageList = projectLogService.page(page, queryWrapper);
return Result.OK(pageList);
}
/**
* 添加
*
* @param projectLog
* @return
*/
@AutoLog(value = "项目操作日志-添加")
@ApiOperation(value = "项目操作日志-添加", notes = "项目操作日志-添加")
@RequiresPermissions("projectLog:project_log:add")
@PostMapping(value = "/add")
public Result<String> add(@RequestBody ProjectLog projectLog) {
projectLogService.save(projectLog);
return Result.OK("添加成功!");
}
/**
* 编辑
*
* @param projectLog
* @return
*/
@AutoLog(value = "项目操作日志-编辑")
@ApiOperation(value = "项目操作日志-编辑", notes = "项目操作日志-编辑")
@RequiresPermissions("projectLog:project_log:edit")
@RequestMapping(value = "/edit", method = {RequestMethod.PUT, RequestMethod.POST})
public Result<String> edit(@RequestBody ProjectLog projectLog) {
projectLogService.updateById(projectLog);
return Result.OK("编辑成功!");
}
/**
* 通过id删除
*
* @param id
* @return
*/
@AutoLog(value = "项目操作日志-通过id删除")
@ApiOperation(value = "项目操作日志-通过id删除", notes = "项目操作日志-通过id删除")
@RequiresPermissions("projectLog:project_log:delete")
@DeleteMapping(value = "/delete")
public Result<String> delete(@RequestParam(name = "id", required = true) String id) {
projectLogService.removeById(id);
return Result.OK("删除成功!");
}
/**
* 批量删除
*
* @param ids
* @return
*/
@AutoLog(value = "项目操作日志-批量删除")
@ApiOperation(value = "项目操作日志-批量删除", notes = "项目操作日志-批量删除")
@RequiresPermissions("projectLog:project_log:deleteBatch")
@DeleteMapping(value = "/deleteBatch")
public Result<String> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
this.projectLogService.removeByIds(Arrays.asList(ids.split(",")));
return Result.OK("批量删除成功!");
}
/**
* 通过id查询
*
* @param id
* @return
*/
//@AutoLog(value = "项目操作日志-通过id查询")
@ApiOperation(value = "项目操作日志-通过id查询", notes = "项目操作日志-通过id查询")
@GetMapping(value = "/queryById")
public Result<ProjectLog> queryById(@RequestParam(name = "id", required = true) String id) {
ProjectLog projectLog = projectLogService.getById(id);
if (projectLog == null) {
return Result.error("未找到对应数据");
}
return Result.OK(projectLog);
}
/**
* 导出excel
*
* @param request
* @param projectLog
*/
@RequiresPermissions("projectLog:project_log:exportXls")
@RequestMapping(value = "/exportXls")
public ModelAndView exportXls(HttpServletRequest request, ProjectLog projectLog) {
return super.exportXls(request, projectLog, ProjectLog.class, "项目操作日志");
}
/**
* 通过excel导入数据
*
* @param request
* @param response
* @return
*/
@RequiresPermissions("projectLog:project_log:importExcel")
@RequestMapping(value = "/importExcel", method = RequestMethod.POST)
public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
return super.importExcel(request, response, ProjectLog.class);
}
}

@ -0,0 +1,120 @@
package org.jeecg.modules.demo.projectLog.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.jeecg.common.aspect.annotation.Dict;
import org.jeecgframework.poi.excel.annotation.Excel;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.util.Date;
/**
* @Description: 项目操作日志
* @Author: jeecg-boot
* @Date: 2024-11-04
* @Version: V1.0
*/
@Data
@TableName("project_log")
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = false)
@ApiModel(value = "project_log对象", description = "项目操作日志")
public class ProjectLog implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键
*/
@TableId(type = IdType.ASSIGN_ID)
@ApiModelProperty(value = "主键")
private String id;
/**
* 创建人
*/
@ApiModelProperty(value = "创建人")
private String createBy;
/**
* 创建日期
*/
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@ApiModelProperty(value = "创建日期")
private Date createTime;
/**
* 更新人
*/
@ApiModelProperty(value = "更新人")
private String updateBy;
/**
* 更新日期
*/
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@ApiModelProperty(value = "更新日期")
private Date updateTime;
/**
* 所属部门
*/
@ApiModelProperty(value = "所属部门")
private String sysOrgCode;
/**
* 项目id
*/
@Excel(name = "项目id", width = 15)
@ApiModelProperty(value = "项目id")
private String projectId;
/**
* 项目名称
*/
@Excel(name = "项目名称", width = 15)
@ApiModelProperty(value = "项目名称")
private String projectName;
/**
* 操作说明
*/
@Excel(name = "操作说明", width = 15)
@ApiModelProperty(value = "操作说明")
private String operationMark;
/**
* 操作时间
*/
@Excel(name = "操作时间", width = 20, format = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@ApiModelProperty(value = "操作时间")
private Date operationTime;
/**
* 操作员id
*/
@Excel(name = "操作员id", width = 15)
@ApiModelProperty(value = "操作员id")
private String operatorId;
/**
* 操作人名称
*/
@Excel(name = "操作人名称", width = 15)
@ApiModelProperty(value = "操作人名称")
private String operatorName;
/**
* 项目书状态
*/
@Excel(name = "项目书状态", width = 15, dicCode = "project_status")
@Dict(dicCode = "project_status")
@ApiModelProperty(value = "项目书状态")
private String projectStatus;
/**
* 预算书状态
*/
@Excel(name = "预算书状态", width = 15, dicCode = "budget_status")
@Dict(dicCode = "budget_status")
@ApiModelProperty(value = "预算书状态")
private String budgetStatus;
}

@ -0,0 +1,17 @@
package org.jeecg.modules.demo.projectLog.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import org.jeecg.modules.demo.projectLog.entity.ProjectLog;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @Description: 项目操作日志
* @Author: jeecg-boot
* @Date: 2024-11-04
* @Version: V1.0
*/
public interface ProjectLogMapper extends BaseMapper<ProjectLog> {
}

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.jeecg.modules.demo.projectLog.mapper.ProjectLogMapper">
</mapper>

@ -0,0 +1,14 @@
package org.jeecg.modules.demo.projectLog.service;
import org.jeecg.modules.demo.projectLog.entity.ProjectLog;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* @Description: 项目操作日志
* @Author: jeecg-boot
* @Date: 2024-11-04
* @Version: V1.0
*/
public interface IProjectLogService extends IService<ProjectLog> {
}

@ -0,0 +1,19 @@
package org.jeecg.modules.demo.projectLog.service.impl;
import org.jeecg.modules.demo.projectLog.entity.ProjectLog;
import org.jeecg.modules.demo.projectLog.mapper.ProjectLogMapper;
import org.jeecg.modules.demo.projectLog.service.IProjectLogService;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
/**
* @Description: 项目操作日志
* @Author: jeecg-boot
* @Date: 2024-11-04
* @Version: V1.0
*/
@Service
public class ProjectLogServiceImpl extends ServiceImpl<ProjectLogMapper, ProjectLog> implements IProjectLogService {
}

@ -161,9 +161,9 @@ spring:
slow-sql-millis: 5000
datasource:
master:
url: jdbc:mysql://127.0.0.1:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
url: jdbc:mysql://182.92.169.222:3306/zmd_kejiju?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
username: root
password: root
password: ycwl2022.
driver-class-name: com.mysql.cj.jdbc.Driver
# 多数据源配置
#multi-datasource1:
@ -174,9 +174,9 @@ spring:
#redis 配置
redis:
database: 0
host: 127.0.0.1
host: 182.92.169.222
port: 6379
password: ''
password: 'redis@ycwl2022.'
#mybatis plus 设置
mybatis-plus:
mapper-locations: classpath*:org/jeecg/**/xml/*Mapper.xml

@ -161,7 +161,7 @@ spring:
slow-sql-millis: 5000
datasource:
master:
url: jdbc:mysql://182.92.169.222:3306/zmd_kejiju?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
url: jdbc:mysql://182.92.169.222:3306/zmd_kejiju1104?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
username: root
password: ycwl2022.
driver-class-name: com.mysql.cj.jdbc.Driver
@ -173,7 +173,7 @@ spring:
#driver-class-name: com.mysql.cj.jdbc.Driver
#redis 配置
redis:
database: 7
database: 8
host: 182.92.169.222
port: 6379
password: 'redis@ycwl2022.'

@ -8,9 +8,9 @@
<developers>
<developer>
<name>北京国炬信息技术有限公司</name>
<email>jeecgos@163.com</email>
<url>http://www.guojusoft.com</url>
<name>驻马店源码自然科技有限公司</name>
<email>ytd@163.com</email>
<url>http://www.hhytd.com</url>
</developer>
</developers>

@ -2,10 +2,10 @@
VITE_PORT = 3500
# 网站标题
VITE_GLOB_APP_TITLE = JeecgBoot 企业级低代码平台
VITE_GLOB_APP_TITLE = 科技管理信息系统
# 简称,此变量只能是字符/下划线
VITE_GLOB_APP_SHORT_NAME = JeecgBoot_Pro
VITE_GLOB_APP_SHORT_NAME = kjj_Pro
# 单点登录服务端地址
VITE_GLOB_APP_CAS_BASE_URL=http://cas.test.com:8443/cas

@ -2,7 +2,7 @@
VITE_USE_MOCK = false
# 发布路径
VITE_PUBLIC_PATH = /
VITE_PUBLIC_PATH = '/kjj'
# 是否启用gzip或brotli压缩
# 选项值: gzip | brotli | none
@ -13,10 +13,10 @@ VITE_BUILD_COMPRESS = 'gzip'
VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE = false
#后台接口父地址(必填)
VITE_GLOB_API_URL=/jeecgboot
VITE_GLOB_API_URL=/kjj
#后台接口全路径地址(必填)
VITE_GLOB_DOMAIN_URL=http://jeecg-boot-system:8080/jeecg-boot
VITE_GLOB_DOMAIN_URL=http://182.92.169.222:8080/jeecg-boot
# 接口父路径前缀
VITE_GLOB_API_URL_PREFIX=

@ -2,9 +2,9 @@
"name": "jeecgboot-vue3",
"version": "3.7.1",
"author": {
"name": "北京国炬信息技术有限公司",
"email": "jeecgos@163.com",
"url": "https://www.jeecg.com"
"name": "驻马店源码自然科技有限公司",
"email": "yichuangwangluo@163.com",
"url": "https://www.hhytd.com"
},
"scripts": {
"pinstall": "pnpm install",

@ -45,7 +45,7 @@
<script name="presetQuestion" setup lang="ts">
import { ref, onMounted, onBeforeUnmount } from 'vue';
const emit = defineEmits(['outQuestion']);
const data = ref(['请介绍一下JeecgBoot', 'JEECG有哪些优势?', 'JEECG可以做哪些事情?']);
const data = ref(['请介绍一下科技局', '科技局有哪些优势?', '科技局可以做哪些事情?']);
const leftBtnStatus = ref('');
const rightBtnStatus = ref('');
const rightBtn = ref('');

@ -24,7 +24,7 @@
<a-descriptions-item label="生效日期"> 2017-07-07 ~ 2017-08-08 </a-descriptions-item>
<a-descriptions-item label="备注"> 请于两个工作日内确认 </a-descriptions-item>
</a-descriptions>
<a-card title="流程进度" :bordered="false">
<a-card title="流程进度" :bordered="true">
<a-steps :current="1" progress-dot size="small">
<a-step title="创建项目">
<template #description> <div>Jeecg</div> <p>2016-12-12 12:32</p> </template>

@ -29,7 +29,7 @@
<BasicTable @register="registerTable" :rowSelection="rowSelection">
<!--插槽:table标题-->
<template #tableTitle>
<a-button type="primary" v-auth="'depadminlx:depadminlx:add'" @click="handleAdd" preIcon="ant-design:plus-outlined"> 新增</a-button>
<a-button type="primary" @click="handleAdd" preIcon="ant-design:plus-outlined"> 新增</a-button>
<a-button type="primary" v-auth="'depadminlx:depadminlx:exportXls'" preIcon="ant-design:export-outlined" @click="onExportXls"> 导出</a-button>
<j-upload-button type="primary" v-auth="'depadminlx:depadminlx:importExcel'" preIcon="ant-design:import-outlined" @click="onImportXls">导入</j-upload-button>
<a-dropdown v-if="selectedRowKeys.length > 0">
@ -182,7 +182,7 @@
{
label: '编辑',
onClick: handleEdit.bind(null, record),
auth: 'depadminlx:depadminlx:edit'
},
];
}
@ -202,7 +202,7 @@
confirm: handleDelete.bind(null, record),
placement: 'topLeft',
},
auth: 'depadminlx:depadminlx:delete'
}
]
}

@ -49,11 +49,11 @@
<a-input v-model:value="formData.dwlxryx" placeholder="请输入单位联系人邮箱" allow-clear ></a-input>
</a-form-item>
</a-col>
<a-col :span="24">
<!-- <a-col :span="24">
<a-form-item label="部门" v-bind="validateInfos.depid" id="DepadminlxForm-depid" name="depid">
<j-search-select v-model:value="formData.depid" dict="sys_depart,depart_name,id" allow-clear />
</a-form-item>
</a-col>
</a-col>-->
</a-row>
</a-form>
</template>

@ -5,6 +5,7 @@ const { createConfirm } = useMessage();
enum Api {
list = '/depfile/depfile/list',
getDepFileList = '/depfile/depfile/getDepFileList',
save='/depfile/depfile/add',
edit='/depfile/depfile/edit',
deleteOne = '/depfile/depfile/delete',
@ -30,6 +31,8 @@ export const getImportUrl = Api.importExcel;
*/
export const list = (params) => defHttp.get({ url: Api.list, params });
export const listDepFile = (params) => defHttp.get({ url: Api.getDepFileList, params });
/**
* 删除单个
* @param params

@ -30,6 +30,92 @@ export const columns: BasicColumn[] = [
align: "center",
dataIndex: 'upfile',
},
{
title: '文件后缀',
align: "center",
dataIndex: 'filehz'
},
{
title: '文件类型',
align: "center",
dataIndex: 'filelx_dictText'
},
];
export const columns2: BasicColumn[] = [
/*{
title: '部门名称',
align: "center",
dataIndex: 'depid_dictText'
},*/
{
title: '附件名称',
align: "center",
dataIndex: 'filename'
},
/*{
title: '认定部门及批号',
align: "center",
dataIndex: 'depnumber'
},
{
title: '认定时间',
align: "center",
dataIndex: 'rdtime'
},*/
{
title: '附件',
align: "center",
dataIndex: 'upfile',
},
{
title: '类型',
align: "center",
dataIndex: 'filehz'
},
/* {
title: '文件类型',
align: "center",
dataIndex: 'filelx_dictText'
},*/
];
export const columns3: BasicColumn[] = [
/*{
title: '部门名称',
align: "center",
dataIndex: 'depid_dictText'
},*/
{
title: '名称',
align: "center",
dataIndex: 'filename'
},
{
title: '认定部门及批号',
align: "center",
dataIndex: 'depnumber'
},
{
title: '认定时间',
align: "center",
dataIndex: 'rdtime'
},
/*{
title: '文件',
align: "center",
dataIndex: 'upfile',
},*/
/*{
title: '文件后缀',
align: "center",
dataIndex: 'filehz'
},
{
title: '文件类型',
align: "center",
dataIndex: 'filelx_dictText'
},*/
];
//

@ -11,7 +11,7 @@
<BasicTable @register="registerTable" :rowSelection="rowSelection">
<!--插槽:table标题-->
<template #tableTitle>
<a-button type="primary" v-auth="'depfile:depfile:add'" @click="handleAdd" preIcon="ant-design:plus-outlined"> 新增</a-button>
<a-button type="primary" @click="handleAdd" preIcon="ant-design:plus-outlined"> 新增</a-button>
<a-button type="primary" v-auth="'depfile:depfile:exportXls'" preIcon="ant-design:export-outlined" @click="onExportXls"> 导出</a-button>
<j-upload-button type="primary" v-auth="'depfile:depfile:importExcel'" preIcon="ant-design:import-outlined" @click="onImportXls">导入</j-upload-button>
<a-dropdown v-if="selectedRowKeys.length > 0">
@ -167,7 +167,7 @@
{
label: '编辑',
onClick: handleEdit.bind(null, record),
auth: 'depfile:depfile:edit'
},
];
}
@ -187,7 +187,7 @@
confirm: handleDelete.bind(null, record),
placement: 'topLeft',
},
auth: 'depfile:depfile:delete'
}
]
}

@ -4,11 +4,11 @@
<template #detail>
<a-form ref="formRef" class="antd-modal-form" :labelCol="labelCol" :wrapperCol="wrapperCol" name="DepfileForm">
<a-row>
<a-col :span="24">
<!-- <a-col :span="24">
<a-form-item label="部门名称" v-bind="validateInfos.depid" id="DepfileForm-depid" name="depid">
<j-search-select v-model:value="formData.depid" dict="sys_depart,depart_name,id" allow-clear />
</a-form-item>
</a-col>
</a-col>-->
<a-col :span="24">
<a-form-item label="名称" v-bind="validateInfos.filename" id="DepfileForm-filename" name="filename">
<a-input v-model:value="formData.filename" placeholder="请输入名称" allow-clear ></a-input>
@ -29,6 +29,12 @@
<j-upload v-model:value="formData.upfile" ></j-upload>
</a-form-item>
</a-col>
<a-col :span="24">
<a-form-item label="文件类型" v-bind="validateInfos.filelx" id="DepfileForm-filelx" name="filelx">
<j-dict-select-tag v-model:value="formData.filelx" dictCode="filetext" placeholder="请选择文件类型" allow-clear />
</a-form-item>
</a-col>
</a-row>
</a-form>
</template>
@ -37,6 +43,7 @@
</template>
<script lang="ts" setup>
import JDictSelectTag from '/@/components/Form/src/jeecg/components/JDictSelectTag.vue';
import { ref, reactive, defineExpose, nextTick, defineProps, computed, onMounted } from 'vue';
import { defHttp } from '/@/utils/http/axios';
import { useMessage } from '/@/hooks/web/useMessage';
@ -61,6 +68,9 @@
depnumber: '',
rdtime: '',
upfile: '',
userid: '',
filehz: '',
filelx: '',
});
const { createMessage } = useMessage();
const labelCol = ref<any>({ xs: { span: 24 }, sm: { span: 5 } });

@ -5,6 +5,7 @@ const { createConfirm } = useMessage();
enum Api {
list = '/depsbncz/depsbncz/list',
getBydepid = '/depsbncz/depsbncz/getBydepid',
save='/depsbncz/depsbncz/add',
edit='/depsbncz/depsbncz/edit',
deleteOne = '/depsbncz/depsbncz/delete',
@ -30,6 +31,10 @@ export const getImportUrl = Api.importExcel;
*/
export const list = (params) => defHttp.get({ url: Api.list, params });
export const listDepsbncz = (params) =>
defHttp.get({url: Api.getBydepid, params});
/**
* 删除单个
* @param params

@ -60,6 +60,75 @@ export const columns: BasicColumn[] = [
align: "center",
dataIndex: 'nsze'
},
{
title: '年度',
align: "center",
dataIndex: 'annualid_dictText'
},
];
export const depsbnczColumns2: BasicColumn[] = [
/*{
title: '部门',
align: "center",
dataIndex: 'depid_dictText'
},*/
{
title: '单位开办费',
align: "center",
dataIndex: 'dwkbf'
},
{
title: '资产合计',
align: "center",
dataIndex: 'zchj'
},
{
title: '负债合计',
align: "center",
dataIndex: 'fzhj'
},
{
title: '净资产',
align: "center",
dataIndex: 'jzc'
},
{
title: '财政拨款',
align: "center",
dataIndex: 'czbk'
},
{
title: '财政拨款专项支出',
align: "center",
dataIndex: 'czbkzxzc'
},
{
title: '经营收入',
align: "center",
dataIndex: 'jysr'
},
{
title: '经营支出',
align: "center",
dataIndex: 'jyzc'
},
{
title: '经营结余',
align: "center",
dataIndex: 'jyjy'
},
{
title: '纳税总额',
align: "center",
dataIndex: 'nsze'
},
/*{
title: '年度',
align: "center",
dataIndex: 'annualid_dictText'
},*/
];
//

@ -11,7 +11,7 @@
<BasicTable @register="registerTable" :rowSelection="rowSelection">
<!--插槽:table标题-->
<template #tableTitle>
<a-button type="primary" v-auth="'depsbncz:depsbncz:add'" @click="handleAdd" preIcon="ant-design:plus-outlined"> 新增</a-button>
<a-button type="primary" @click="handleAdd" preIcon="ant-design:plus-outlined"> 新增</a-button>
<a-button type="primary" v-auth="'depsbncz:depsbncz:exportXls'" preIcon="ant-design:export-outlined" @click="onExportXls"> 导出</a-button>
<j-upload-button type="primary" v-auth="'depsbncz:depsbncz:importExcel'" preIcon="ant-design:import-outlined" @click="onImportXls">导入</j-upload-button>
<a-dropdown v-if="selectedRowKeys.length > 0">
@ -162,7 +162,7 @@
{
label: '编辑',
onClick: handleEdit.bind(null, record),
auth: 'depsbncz:depsbncz:edit'
},
];
}
@ -182,7 +182,7 @@
confirm: handleDelete.bind(null, record),
placement: 'topLeft',
},
auth: 'depsbncz:depsbncz:delete'
}
]
}

@ -4,11 +4,11 @@
<template #detail>
<a-form ref="formRef" class="antd-modal-form" :labelCol="labelCol" :wrapperCol="wrapperCol" name="DepsbnczForm">
<a-row>
<a-col :span="24">
<!-- <a-col :span="24">
<a-form-item label="部门" v-bind="validateInfos.depid" id="DepsbnczForm-depid" name="depid">
<j-search-select v-model:value="formData.depid" dict="sys_depart,depart_name,id" allow-clear />
</a-form-item>
</a-col>
</a-col>-->
<a-col :span="24">
<a-form-item label="单位开办费" v-bind="validateInfos.dwkbf" id="DepsbnczForm-dwkbf" name="dwkbf">
<a-input v-model:value="formData.dwkbf" placeholder="请输入单位开办费" allow-clear ></a-input>

@ -21,7 +21,7 @@
<j-select-multiple placeholder="请选择部门审核" v-model:value="queryParam.compopen" dictCode="examstures" allow-clear />
</a-form-item>
</a-col>
</a-col>
<template v-if="toggleSearchStatus">
<a-col :lg="6">
<a-form-item name="research">

@ -4,40 +4,66 @@
<BasicTable @register="registerTable" :rowSelection="rowSelection">
<!--插槽:table标题-->
<template #tableTitle>
<a-button type="primary" @click="handleAdd" preIcon="ant-design:plus-outlined"> 上传附件</a-button>
</template>
<a-button type="primary" @click="handleAdd" preIcon="ant-design:plus-outlined"> 上传附件
</a-button>
</template>
<!--操作栏-->
<template #action="{ record }">
<TableAction :actions="getTableAction(record)" :dropDownActions="getDropDownAction(record)"/>
<TableAction :actions="getTableAction(record)"
:dropDownActions="getDropDownAction(record)"/>
</template>
<!--字段回显插槽-->
<template v-slot:bodyCell="{ column, record, index, text }">
<template v-if="column.dataIndex==='fileUrl'">
<!--文件字段回显插槽-->
<span v-if="!text" style="font-size: 12px;font-style: italic;">无文件</span>
<a-button v-else :ghost="true" type="primary" preIcon="ant-design:download-outlined" size="small" @click="downloadFile(text)">下载</a-button>
<a-button v-else :ghost="true" type="primary" preIcon="ant-design:download-outlined"
size="small" @click="downloadFile(text)">下载
</a-button>
</template>
</template>
</BasicTable>
<!-- 表单区域 -->
<ProjectFileModal @register="registerModal" @success="handleSuccess"></ProjectFileModal>
</div>
<div>
<BasicTable title="单位相关附件" @register="depfileTable">
<template v-slot:bodyCell="{ column, record, index, text }">
<template v-if="column.dataIndex==='upfile'">
<!--文件字段回显插槽-->
<span v-if="!text" style="font-size: 12px;font-style: italic;">无文件</span>
<a-button v-else :ghost="true" type="primary" preIcon="ant-design:download-outlined"
size="small" @click="downloadFile(text)">下载
</a-button>
</template>
</template>
</BasicTable>
</div>
<div class="button-container">
<a-button type="primary" @click="goBack">返回</a-button>
</div>
</template>
<script lang="ts" name="projectFile-projectFile" setup>
import {ref, reactive, computed, unref} from 'vue';
import {BasicTable, useTable, TableAction} from '/@/components/Table';
import {reactive, ref} from 'vue';
import {BasicTable, TableAction, useTable} from '/@/components/Table';
import {useModal} from '/@/components/Modal';
import { useListPage } from '/@/hooks/system/useListPage'
import {useListPage} from '/@/hooks/system/useListPage'
import ProjectFileModal from '/@/views/projectFile/components/ProjectFileModal.vue'
import {columns, searchFormSchema, superQuerySchema} from '/@/views/projectFile/ProjectFile.data';
import {list, deleteOne, batchDelete, getImportUrl,getExportUrl} from '/@/views/projectFile/ProjectFile.api';
import { downloadFile } from '/@/utils/common/renderUtils';
import { useUserStore } from '/@/store/modules/user';
import {
batchDelete,
deleteOne,
getExportUrl,
getImportUrl,
list
} from '/@/views/projectFile/ProjectFile.api';
import {downloadFile} from '/@/utils/common/renderUtils';
import {useUserStore} from '/@/store/modules/user';
import {useRoute, useRouter} from "vue-router";
import {listDepFile} from "@/views/depfile/Depfile.api";
import {columns2} from "@/views/depfile/Depfile.data";
const queryParam = reactive<any>({});
const checkedKeys = ref<Array<string | number>>([]);
const userStore = useUserStore();
@ -46,33 +72,31 @@ const route = useRoute();
//model
const [registerModal, {openModal}] = useModal();
//table
const { prefixCls,tableContext,onExportXls,onImportXls } = useListPage({
tableProps:{
const {prefixCls, tableContext, onExportXls, onImportXls} = useListPage({
tableProps: {
title: '项目书附件',
api: listByProjectId,
// api: list,
columns,
canResize:false,
canResize: false,
formConfig: {
//labelWidth: 120,
schemas: searchFormSchema,
autoSubmitOnEnter:true,
showAdvancedButton:true,
fieldMapToNumber: [
],
fieldMapToTime: [
],
autoSubmitOnEnter: true,
showAdvancedButton: true,
fieldMapToNumber: [],
fieldMapToTime: [],
},
actionColumn: {
width: 120,
fixed:'right'
fixed: 'right'
},
beforeFetch: (params) => {
return Object.assign(params, queryParam);
},
},
exportConfig: {
name:"项目书附件",
name: "项目书附件",
url: getExportUrl,
params: queryParam,
},
@ -82,7 +106,7 @@ const { prefixCls,tableContext,onExportXls,onImportXls } = useListPage({
},
})
const [registerTable, {reload},{ rowSelection, selectedRowKeys }] = tableContext
const [registerTable, {reload}, {rowSelection, selectedRowKeys}] = tableContext
//
const superQueryConfig = reactive(superQuerySchema);
@ -100,6 +124,27 @@ function goBack() {
back();
};
const [depfileTable] = useTable({
label: '单位相关附件',
columns: columns2,
pagination: false,
// dataSource: null,
api: listdepfileByDepId,
showIndexColumn: false,
scroll: {y: 300},
});
async function listdepfileByDepId() {
let params = {
depid: userStore.getUserInfo.orgCode,
filelx: '1',
};
console.log(JSON.stringify(params));
return await listDepFile(params);
};
/**
* 高级查询事件
*/
@ -109,6 +154,7 @@ function handleSuperQuery(params) {
});
reload();
}
/**
* 新增事件
*/
@ -118,6 +164,7 @@ function handleAdd() {
showFooter: true,
});
}
/**
* 编辑事件
*/
@ -128,6 +175,7 @@ function handleEdit(record: Recordable) {
showFooter: true,
});
}
/**
* 详情
*/
@ -138,28 +186,32 @@ function handleDetail(record: Recordable) {
showFooter: false,
});
}
/**
* 删除事件
*/
async function handleDelete(record) {
await deleteOne({id: record.id}, handleSuccess);
}
/**
* 批量删除事件
*/
async function batchHandleDelete() {
await batchDelete({ids: selectedRowKeys.value}, handleSuccess);
}
/**
* 成功回调
*/
function handleSuccess() {
(selectedRowKeys.value = []) && reload();
}
/**
* 操作栏
*/
function getTableAction(record){
function getTableAction(record) {
return [
{
label: '编辑',
@ -168,10 +220,11 @@ function getTableAction(record){
}
]
}
/**
* 下拉操作栏
*/
function getDropDownAction(record){
function getDropDownAction(record) {
return [
{
label: '详情',
@ -192,11 +245,12 @@ function getDropDownAction(record){
</script>
<style lang="less" scoped>
:deep(.ant-picker),
:deep(.ant-input-number){
width: 100%;
}
.button-container {
text-align: center;
}
:deep(.ant-picker),
:deep(.ant-input-number) {
width: 100%;
}
.button-container {
text-align: center;
}
</style>

@ -15,7 +15,7 @@
<a-col :span="24">
<template v-if="file.filePdfPath">
<div @click="pdfPreview(file.title)">
<img style="width: 80px; height: 80px" src="../../../assets/images/pdf4.jpg" />
<img style="width: 80px; height: 80px" src="/@/assets/images/pdf4.jpg" />
</div>
</template>
<template v-else> (暂无材料点击"选择文件""扫描上传"上传文件) </template>

@ -11,7 +11,7 @@
<!-- <a-tab-pane key="JeecgPdfView" tab="PDF预览"></a-tab-pane>-->
<a-tab-pane key="XiangMuJiXiaoMuBiaoDemo" tab="项目绩效目标"></a-tab-pane>
<a-tab-pane key="YiJianDemo" tab="意见"></a-tab-pane>
<a-tab-pane key="FuJianDemo" tab="文件上传"></a-tab-pane>
<a-tab-pane key="FuJianDemo" tab="附件"></a-tab-pane>
</a-tabs>
<component :is="currentComponent"></component>
</a-card>

@ -2,19 +2,28 @@
<div v-if="falg">
<PageWrapper>
<Description
title="单位基本情况表:"
label="单位基本情况表:"
:collapseOptions="{ canExpand: false}"
:column="2"
:data="DepartBaseInfoData"
:schema="schema"
/>
<div>
<BasicTable title="单位技术研究资质情况" @register="depfileTable">
<template v-slot:bodyCell="{ column, record, index, text }">
<template v-if="column.dataIndex==='upfile'">
<!--文件字段回显插槽-->
<span v-if="!text" style="font-size: 12px;font-style: italic;">无文件</span>
<a-button v-else :ghost="true" type="primary" preIcon="ant-design:download-outlined"
size="small" @click="downloadFile(text)">下载
</a-button>
</template>
</template>
</BasicTable>
<BasicTable title="上年度(末)主要财务数据" @register="depsbnczTable" />
</div>
</PageWrapper>
<BasicTable @register="registerTimeTable"/>
</div>
<!-- <div>
&lt;!&ndash;引用表格&ndash;&gt;
<BasicTable @register="registerTable"></BasicTable>
</div>-->
<div class="button-container">
<a-button type="primary" @click="router.back();">返回</a-button>
</div>
@ -28,11 +37,16 @@ import {BasicTable, useTable} from '/@/components/Table';
import {useRoute, useRouter} from "vue-router";
import {useModal} from "@/components/Modal";
import {list} from '@/views/projectApplication/project/Project.api';
import {getDepartByProjectId} from './FengMian.api';
import {columns2} from "@/views/cooperationDepart/CooperationDepart.data";
import {list2} from "@/views/cooperationDepart/CooperationDepart.api";
import { useUserStore } from '/@/store/modules/user';
const { userInfo } = useUserStore();
import {getDepartDtoByProjectId} from '/@/views/projectApplication/project/Project.api';
// import {columns2} from "@/views/cooperationDepart/CooperationDepart.data";
import {list2} from "@/views/cooperationDepart/CooperationDepart.api";
import {depsbnczColumns2} from "@/views/depsbncz/Depsbncz.data";
import {listDepsbncz} from "@/views/depsbncz/Depsbncz.api";
import {listDepFile} from "@/views/depfile/Depfile.api";
import {columns3} from "@/views/depfile/Depfile.data";
const route = useRoute();
const router = useRouter();
const falg = ref(false)
@ -43,12 +57,12 @@ const DepartBaseInfoData: any = {
phone: '',
realName: '',
email: '',
title: '',
label: '',
};
const [registerTimeTable] = useTable({
title: '单位技术研究资质情况:',
columns: columns2,
/*const [registerTimeTable] = useTable({
label: '单位技术研究资质情况:',
columns: columns3,
pagination: false,
// dataSource: null,
api: listCooperationByProjectId,
@ -62,6 +76,25 @@ async function listCooperationByProjectId() {
};
console.log(JSON.stringify(params));
return await list2(params);
};*/
const [depsbnczTable] = useTable({
label: '上年度(末)主要财务数据',
columns: depsbnczColumns2,
pagination: false,
// dataSource: null,
api: listDepsbnczByProjectId,
showIndexColumn: false,
scroll: {y: 300},
});
async function listDepsbnczByProjectId() {
let params = {
depid: userInfo.orgCode,
};
console.log(JSON.stringify(params));
return await listDepsbncz(params);
};
@ -80,6 +113,27 @@ const schema2: any = [
},
];
const [depfileTable] = useTable({
label: '单位技术研究资质情况',
columns: columns3,
pagination: false,
// dataSource: null,
api: listdepfileByDepId,
showIndexColumn: false,
scroll: {y: 300},
});
async function listdepfileByDepId() {
let params = {
depid: userInfo.orgCode,
filelx: '2',
};
console.log(JSON.stringify(params));
return await listDepFile(params);
};
const schema: any = [
{
field: 'annualName',
@ -113,10 +167,6 @@ const schema: any = [
label: '账号',
field: 'bankNo',
},
{
label: '职工总数',
field: 'employeeNum',
},
{
label: '上年度研发(R&D)经费(万元)',
field: 'lastYearFee',
@ -126,6 +176,57 @@ const schema: any = [
field: 'registerDate',
},
{
label: '预算管理形式',
field: 'ysczbk',
},
{
label: '编制数',
// align: "center",
field: 'bzs'
},
{
label: '在职职工人数:',
// align: "center",
field: 'zzzgrs'
},
{
label: '中级职称以上研究人员数',
// align: "center",
field: 'zjzcysyjrys'
},
{
label: '单位联系人姓名',
align: "center",
field: 'dwlxrxm'
},
{
label: '单位联系人职称',
align: "center",
field: 'dwlxrzc'
},
{
label: '单位联系人职务',
align: "center",
field: 'dwlxrzw'
},
{
label: '单位联系人电话',
align: "center",
field: 'dwlxrdh'
},
{
label: '单位联系人手机',
align: "center",
field: 'dwlxrsj'
},
{
label: '单位联系人邮箱',
align: "center",
field: 'dwlxryx'
},
/*{
label: '联系人',
field: 'linkmanName',
},
@ -136,21 +237,21 @@ const schema: any = [
{
label: '电子邮箱',
field: 'linkmanEmail'
},
},*/
];
async function getData() {
let params = {
id: route.query.id,
};
let obj = await getDepartByProjectId(params);
let obj = await getDepartDtoByProjectId(params);
console.log('data', JSON.stringify(obj))
DepartBaseInfoData.annualName = obj.annualName;
DepartBaseInfoData.departName = obj.departName;
DepartBaseInfoData.departNameAbbr = obj.departNameAbbr;
DepartBaseInfoData.linkmanName = obj.linkmanName;
DepartBaseInfoData.linkmanEmail = obj.linkmanEmail;
DepartBaseInfoData.linkmanPhone = obj.linkmanPhone;
// DepartBaseInfoData.linkmanName = obj.linkmanName;
// DepartBaseInfoData.linkmanEmail = obj.linkmanEmail;
// DepartBaseInfoData.linkmanPhone = obj.linkmanPhone;
DepartBaseInfoData.orgCategory = obj.orgCategory;
DepartBaseInfoData.address = obj.address;
DepartBaseInfoData.bankNo = obj.bankNo;
@ -161,6 +262,18 @@ async function getData() {
DepartBaseInfoData.mobile = obj.mobile;
DepartBaseInfoData.type = obj.type;
DepartBaseInfoData.registerDate = obj.registerDate;
DepartBaseInfoData.bzs = obj.bzs;
DepartBaseInfoData.zzzgrs = obj.zzzgrs;
DepartBaseInfoData.zjzcysyjrys = obj.zjzcysyjrys;
DepartBaseInfoData.dwlxrxm = obj.dwlxrxm;
DepartBaseInfoData.dwlxrzc = obj.dwlxrzc;
DepartBaseInfoData.dwlxrzw = obj.dwlxrzw;
DepartBaseInfoData.dwlxrdh = obj.dwlxrdh;
DepartBaseInfoData.dwlxrsj = obj.dwlxrsj;
DepartBaseInfoData.dwlxryx = obj.dwlxryx;
DepartBaseInfoData.ysczbk = '预算管理形式';
console.log('DepartBaseInfoData', JSON.stringify(DepartBaseInfoData))
falg.value = true
}

@ -4,23 +4,15 @@
<thead>
<tr>
<th rowspan="2" style="width: 300px; position: relative">
<div
style="
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
"
>
<!-- <a-button @click="save" type="primary">Primary Button</a-button>-->
<th>单位名称</th>
<div style="position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%)">
<!-- <a-button @click="save" type="primary">Primary Button</a-button>-->
单位名称
</div>
</th>
<th colspan="3">分年预算</th>
<th rowspan="2">合计</th>
<th rowspan="2">合计</th>
</tr>
<tr>
<th><a-date-picker v-model:value="data.year1" picker="year" /></th>
<th><a-date-picker v-model:value="data.year2" picker="year" /></th>
<th><a-date-picker v-model:value="data.year3" picker="year" /></th>
@ -32,67 +24,68 @@
<td><a-input prefix="¥" suffix="RMB" v-model:value="data.year1Value" /></td>
<td><a-input prefix="¥" suffix="RMB" v-model:value="data.year2Value" /></td>
<td><a-input prefix="¥" suffix="RMB" v-model:value="data.year3Value" /></td>
<td>{{Amount}}</td>
<td>{{ Amount }}</td>
</tr>
</tbody>
</table>
</div>
<div class="button-container">
<a-button type="primary" @click="handleSubmit">保存</a-button>
<a-button type="primary" @click="router.back();">返回</a-button>
<div class="button-container" style="margin-top: 50px">
<a-button type="primary" @click="handleSubmit">保存</a-button>
<a-button type="primary" @click="router.back()" style="margin-left: 30px">返回</a-button>
</div>
</div>
</template>
<script setup>
import {ref,onMounted,computed} from 'vue'
import {useRoute, useRouter} from "vue-router";
import {saveOrUpdate} from "@/views/projectAnnualBudget/ProjectAnnualBudget.api";
import {defHttp} from "@/utils/http/axios";
import {useMessage} from "@/hooks/web/useMessage";
import { ref, onMounted, computed } from 'vue';
import { useRoute, useRouter } from 'vue-router';
import { saveOrUpdate } from '@/views/projectAnnualBudget/ProjectAnnualBudget.api';
import { defHttp } from '@/utils/http/axios';
import { useMessage } from '@/hooks/web/useMessage';
import dayjs from 'dayjs';
const { createMessage } = useMessage();
const router = useRouter();
const route = useRoute();
// import moment from 'moment';
const data = ref({
year1:'',
year2:'',
year3:'',
year1Value:0,
year2Value:0,
year3Value:0,
departName:'',
totalAmount:''
})
onMounted(()=> {
year1: '',
year2: '',
year3: '',
year1Value: 0,
year2Value: 0,
year3Value: 0,
departName: '',
totalAmount: '',
});
onMounted(() => {
loadData();
})
// data.value.year1 = dayjs('2018/01/01','YYYY/MM/DD')
});
const handleSubmit = async () => {
const handleSubmit = async () => {
let params = {
year1:data.value.year1.$y,
year2:data.value.year2.$y,
year3:data.value.year3.$y,
year1Value:data.value.year1Value,
year2Value:data.value.year2Value,
year3Value:data.value.year3Value,
departName:data.value.departName,
totalAmount:Number(data.value.year1Value) + Number(data.value.year2Value) + Number(data.value.year3Value),
}
year1: data.value.year1.$y,
year2: data.value.year2.$y,
year3: data.value.year3.$y,
year1Value: data.value.year1Value,
year2Value: data.value.year2Value,
year3Value: data.value.year3Value,
departName: data.value.departName,
totalAmount: Number(data.value.year1Value) + Number(data.value.year2Value) + Number(data.value.year3Value),
};
params.projectId = route.query.id;
defHttp
.post({
url: '/projectAnnualBudget/projectAnnualBudget/add/'+route.query.id,
params: params,
})
/*.then(() => {
// createMessage.success(``);
// loadData();
})
.finally(() => {
// loading.value = false;
});*/
}
defHttp.post({
url: '/projectAnnualBudget/projectAnnualBudget/add/' + route.query.id,
params: params,
});
/*.then(() => {
// createMessage.success(``);
// loadData();
})
.finally(() => {
// loading.value = false;
});*/
};
//
async function loadData() {
@ -101,31 +94,36 @@ async function loadData() {
await defHttp
.get({
//
url: '/projectAnnualBudget/projectAnnualBudget/queryByProjectId/'+route.query.id,
}).then((result) => {
data.value.year1Value = result.year1Value
data.value.year2Value = result.year2Value
data.value.year3Value = result.year3Value
data.value.departName = result.departName
console.log("the data()",JSON.stringify(result))
url: '/projectAnnualBudget/projectAnnualBudget/queryByProjectId/' + route.query.id,
})
.then((result) => {
data.value.year1Value = result.year1Value;
data.value.year2Value = result.year2Value;
data.value.year3Value = result.year3Value;
data.value.departName = result.departName;
data.value.year1 = dayjs(result.year1, 'YYYY');
data.value.year2 = dayjs(result.year2, 'YYYY');
data.value.year3 = dayjs(result.year3, 'YYYY');
console.log('the data()', JSON.stringify(result));
// total
// pagination.total = result.total;
// dataSource
// dataSource.value = result.records;
// //
// selectedRows.value = [];
})
});
}
const Amount = computed(() => {
return Number(data.value.year1Value) + Number(data.value.year2Value) + Number(data.value.year3Value)
})
return Number(data.value.year1Value) + Number(data.value.year2Value) + Number(data.value.year3Value);
});
</script>
<style scoped lang="less">
.container {
width: 100%;
height: 500px;
margin-top: 20px;
}
table {
width: 100%;

@ -5,7 +5,7 @@
<a-tab-pane key="FengMianDemo" tab="封面" force-render></a-tab-pane>
<a-tab-pane key="TianBaoShuMingDemo" tab="填报说明" force-render></a-tab-pane>
<a-tab-pane key="ProjectBaseInfoDemo" tab="项目基本情况表"></a-tab-pane>
<a-tab-pane key="DepartBaseInfoDemo" tab="部门基本情况表"></a-tab-pane>
<a-tab-pane key="DepartBaseInfoDemo" tab="单位基本情况表"></a-tab-pane>
<a-tab-pane key="ProjectFeeBudgetDemo" tab="项目经费预算表"></a-tab-pane>
<a-tab-pane key="NianDuYuSuanDemo" tab="财政拨款、年度预算表"></a-tab-pane>
<!-- <a-tab-pane key="ZhengWenDemo" tab="正文"></a-tab-pane>-->

@ -0,0 +1,103 @@
import {defHttp} from '@/utils/http/axios';
import {useMessage} from "@/hooks/web/useMessage";
const {createConfirm} = useMessage();
enum Api {
list = '/project/project/list',
list4Audit = '/project/project/list4Audit',
projectType = '/projectType/getProjectTypeList',
departDtoInfo = '/project/project/getDepartDtoInfo',
save = '/project/project/add',
edit = '/project/project/edit',
deleteOne = '/project/project/delete',
submitOne = '/project/project/submitApply',
rollbackOne = '/project/project/rollbackProject',
deleteBatch = '/project/project/deleteBatch',
importExcel = '/project/project/importExcel',
exportXls = '/project/project/exportXls',
}
export const getDepartDtoByProjectId = (params) =>
defHttp.get({url: Api.departDtoInfo, params});
/**
* 导出api
* @param params
*/
export const getExportUrl = Api.exportXls;
/**
* 导入api
*/
export const getImportUrl = Api.importExcel;
/**
* 列表接口
* @param params
*/
export const list = (params) =>
defHttp.get({url: Api.list, params});
export const list4Audit = (params) =>
defHttp.get({url: Api.list4Audit, params});
export const getProjectTypeList = (params) =>
defHttp.get({url: Api.projectType, params});
export const getDepartBaseInfo = (params) =>
defHttp.get({url: Api.departBaseInfo, params});
/**
* 删除单个
*/
export const deleteOne = (params, handleSuccess) => {
return defHttp.delete({url: Api.deleteOne, params}, {joinParamsToUrl: true}).then(() => {
handleSuccess();
});
}
export const submitOne = (params, handleSuccess) => {
return defHttp.post({url: Api.submitOne, params}, {joinParamsToUrl: true}).then(() => {
handleSuccess();
});
}
export const rollbackOne = (params, handleSuccess) => {
return defHttp.post({url: Api.rollbackOne, params}, {joinParamsToUrl: true}).then(() => {
handleSuccess();
});
}
/**
* 批量删除
* @param params
*/
export const batchDelete = (params, handleSuccess) => {
createConfirm({
iconType: 'warning',
title: '确认删除',
content: '是否删除选中数据',
okText: '确认',
cancelText: '取消',
onOk: () => {
return defHttp.delete({
url: Api.deleteBatch,
data: params
}, {joinParamsToUrl: true}).then(() => {
handleSuccess();
});
}
});
}
/**
* 保存或者更新
* @param params
*/
export const saveOrUpdate = (params, isUpdate) => {
let url = isUpdate ? Api.edit : Api.save;
return defHttp.post({url: url, params});
}

@ -0,0 +1,421 @@
import {BasicColumn, FormSchema} from '@/components/Table';
import {render} from '@/utils/common/renderUtils';
import { useUserStore } from '@/store/modules/user';
import {computed, unref, onMounted, nextTick, ref, onBeforeMount} from 'vue';
import {useTimeoutFn} from "@/hooks/core/useTimeout";
import step from "@/views/demo/page/form/step/index.vue";
import {getMenus} from "@/router/menus";
import {cloneDeep} from "lodash-es";
import {forEach} from "@/utils/helper/treeHelper";
//
export const columns: BasicColumn[] = [
{
title: '项目名称',
align: "center",
dataIndex: 'projectName'
},
{
title: '项目类别',
align: "center",
// dataIndex: 'projectTypeid_dictText'
dataIndex: 'projectTypeid_dictText'
},
{
title: '申请单位',
align: "center",
dataIndex: 'sysOrgCode_dictText'
},
{
title: '负责人',
align: "center",
dataIndex: 'projectCharger_dictText'
},
{
title: '项目书状态',
align: "center",
dataIndex: 'projectStatus_dictText'
},
{
title: '预算书状态',
align: "center",
dataIndex: 'budgetStatus_dictText'
},
];
//
export const searchFormSchema: FormSchema[] = [
{
label: "所属部门",
field: 'sysOrgCode',
component: 'JSelectDept',
componentProps: {},
//colProps: {span: 6},
},
{
label: "负责人",
field: 'projectCharger',
component: 'JSelectUser',
componentProps: {},
//colProps: {span: 6},
},
{
label: "项目名称",
field: "projectName",
component: 'Input', //TODO
//colProps: {span: 6},
},
{
label: "项目领域",
field: 'projectDomain',
component: 'JDictSelectTag',
componentProps: {
dictCode: "project_domain"
},
//colProps: {span: 6},
},
{
label: "项目类别",
field: 'projectTypeid',
component: 'JDictSelectTag',
componentProps: {
// dictCode: "sys_user,realname,id,username!='admin' order by create_time",
dictCode: 'project_type,type_name,id,status ="1" order by create_time desc ',
},
},
{
label: "项目书状态",
field: 'projectStatus',
component: 'JDictSelectTag',
componentProps: {
dictCode: "project_status"
},
//colProps: {span: 6},
},
/*{
label: "预算书状态",
field: 'budgetStatus',
component: 'JDictSelectTag',
componentProps: {
dictCode: "budget_status"
},
//colProps: {span: 6},
},*/
];
//
export const formSchema: FormSchema[] = [
{
label: '所属部门',
field: 'sysOrgCode',
component: 'JSelectDept',
componentProps: {},
defaultValue: useUserStore().getUserInfo?.orgCode,
},
{
label: '负责人',
field: 'projectCharger',
component: 'JSelectUser',
componentProps: {},
defaultValue: useUserStore().getUserInfo?.username,
},
{
label: '项目类别',
field: 'projectTypeid',
component: 'Input',
dynamicDisabled: true
},
{
label: '批次',
field: 'batchNo',
defaultValue: "1",
component: 'Input',
dynamicDisabled: true
},
{
label: '项目名称',
field: 'projectName',
component: 'Input',
dynamicRules: ({model, schema}) => {
return [
{required: true, message: '请输入项目名称!'},
];
},
},
{
label: '项目领域',
field: 'projectDomain',
component: 'JDictSelectTag',
componentProps: {
dictCode: "project_domain",
type: "radio"
},
},
{
label: '新兴产业',
field: 'emergingIndustry',
component: 'JDictSelectTag',
componentProps: {
dictCode: "emerging_industry",
type: "radio"
},
},
{
label: '传统产业',
field: 'traditionalIndustry',
component: 'JDictSelectTag',
componentProps: {
dictCode: "traditional_industry",
type: "radio"
},
},
{
label: '技术来源',
field: 'technicalSource',
component: 'JDictSelectTag',
componentProps: {
dictCode: "technical_source",
type: "radio"
},
},
{
label: '技术水平',
field: 'technicalLevel',
component: 'JDictSelectTag',
componentProps: {
dictCode: "technical_level",
type: "radio"
},
},
{
label: '预期主要成果形式',
field: 'resultForm',
component: 'JCheckbox',
componentProps: {
dictCode: "result_form"
},
},
{
label: '经费投入(万元)',
field: 'fundInput',
component: 'InputNumber',
},
{
label: '申请省财政拨款(万元)',
field: 'applyFund',
component: 'InputNumber',
},
{
label: '所属实验室&研究中心',
field: 'laboratory',
component: 'Input',
},
{
label: '地方投入(万元)',
field: 'localInput',
component: 'InputNumber',
},
{
label: '银行贷款(万元)',
field: 'bankLoan',
component: 'InputNumber',
},
{
label: '自筹(万元)',
field: 'selfRaise',
component: 'InputNumber',
},
{
label: '项目开始时间',
field: 'startTime',
component: 'DatePicker',
componentProps: {
valueFormat: 'YYYY-MM-DD'
},
},
{
label: '项目结束时间',
field: 'endTime',
component: 'DatePicker',
componentProps: {
valueFormat: 'YYYY-MM-DD'
},
},
{
label: '年生产能力(万元)',
field: 'yearlyCapacity',
component: 'InputNumber',
},
{
label: '就业人数',
field: 'employmentFigure',
component: 'Input',
},
{
label: '年销售收入(万元)',
field: 'annualSalesRevenue',
component: 'InputNumber',
},
{
label: '年出口创汇(万元)',
field: 'annualExportEarnings',
component: 'InputNumber',
},
{
label: '年纳税总额(万元)',
field: 'totalAnnualTaxPayment',
component: 'InputNumber',
},
{
label: '年净利润(万元)',
field: 'annualProfit',
component: 'InputNumber',
},
{
label: '申请专利数',
field: 'applyPatentNumber',
component: 'Input',
},
{
label: '发明专利数',
field: 'invevtionPatentNumber',
component: 'Input',
},
{
label: '授权专利数',
field: 'creditPatentNumber',
component: 'Input',
},
{
label: '项目书状态',
field: 'projectStatus',
component: 'JDictSelectTag',
componentProps: {
dictCode: "project_status"
},
defaultValue: "5", //
// dynamicDisabled: true,
ifShow: false,
},
{
label: '预算书状态',
field: 'budgetStatus',
component: 'JDictSelectTag',
componentProps: {
dictCode: "budget_status"
},
defaultValue: "10", //
// dynamicDisabled: true,
ifShow: false,
},
// TODO ID
{
label: '',
field: 'id',
component: 'Input',
show: false
},
];
//
export const superQuerySchema = {
sysOrgCode: {title: '所属部门', order: 0, view: 'sel_depart', type: 'string',},
projectName: {title: '项目名称', order: 1, view: 'text', type: 'string',},
projectDomain: {
title: '项目领域',
order: 2,
view: 'radio',
type: 'string',
dictCode: 'project_domain',
},
emergingIndustry: {
title: '新兴产业',
order: 3,
view: 'radio',
type: 'string',
dictCode: 'emerging_industry',
},
traditionalIndustry: {
title: '传统产业',
order: 4,
view: 'radio',
type: 'string',
dictCode: 'traditional_industry',
},
technicalSource: {
title: '技术来源',
order: 5,
view: 'radio',
type: 'string',
dictCode: 'technical_source',
},
technicalLevel: {
title: '技术水平',
order: 6,
view: 'radio',
type: 'string',
dictCode: 'technical_level',
},
resultForm: {
title: '预期主要成果形式',
order: 7,
view: 'checkbox',
type: 'string',
dictCode: 'result_form',
},
fundInput: {title: '经费投入(万元)', order: 8, view: 'number', type: 'number',},
applyFund: {title: '申请省财政拨款(万元)', order: 9, view: 'number', type: 'number',},
/* isAcceptInitProject: {
title: '如无经费支持是否接受指导项目立项',
order: 10,
view: 'switch',
type: 'string',
},*/
laboratory: {title: '所属实验室、研究中心', order: 11, view: 'text', type: 'string',},
localInput: {title: '地方投入', order: 12, view: 'number', type: 'number',},
bankLoan: {title: '银行贷款', order: 13, view: 'number', type: 'number',},
selfRaise: {title: '自筹', order: 14, view: 'number', type: 'number',},
startTime: {title: '项目开始时间', order: 15, view: 'date', type: 'string',},
endTime: {title: '项目结束时间', order: 16, view: 'date', type: 'string',},
yearlyCapacity: {title: '年生产能力', order: 17, view: 'number', type: 'number',},
employmentFigure: {title: '就业人数', order: 18, view: 'text', type: 'string',},
annualSalesRevenue: {title: '年销售收入', order: 19, view: 'number', type: 'number',},
annualExportEarnings: {title: '年出口创汇', order: 20, view: 'number', type: 'number',},
totalAnnualTaxPayment: {title: '年纳税总额', order: 21, view: 'number', type: 'number',},
annualProfit: {title: '年净利润', order: 22, view: 'number', type: 'number',},
applyPatentNumber: {title: '申请专利数', order: 23, view: 'text', type: 'string',},
invevtionPatentNumber: {title: '发明专利数', order: 24, view: 'text', type: 'string',},
creditPatentNumber: {title: '授权专利数', order: 25, view: 'text', type: 'string',},
projectTypeid: {title: '项目类别', order: 26, view: 'text', type: 'string',},
batchNo: {title: '批次', order: 27, view: 'text', type: 'string',},
projectStatus: {
title: '项目书状态',
order: 28,
view: 'list',
type: 'string',
dictCode: 'project_status',
},
budgetStatus: {
title: '预算书状态',
order: 29,
view: 'list',
type: 'string',
dictCode: 'budget_status',
},
projectCharger: {title: '负责人', order: 30, view: 'sel_user', type: 'string',},
};
// (function (){
// alert('1111111');
//
// })();
/**
* 流程表单调用这个方法获取formSchema
* @param param
*/
export function getBpmFormSchema(_formData): FormSchema[] {
// formSchema
return formSchema;
}

@ -0,0 +1,70 @@
<template>
<div style="min-height: 400px">
<BasicForm @register="registerForm"></BasicForm>
<div style="width: 100%;text-align: center" v-if="!formDisabled">
<a-button @click="submitForm" pre-icon="ant-design:check" type="primary"> </a-button>
</div>
</div>
</template>
<script lang="ts">
import {BasicForm, useForm} from '/@/components/Form/index';
import {computed, defineComponent} from 'vue';
import {defHttp} from '/@/utils/http/axios';
import { propTypes } from '/@/utils/propTypes';
import {getBpmFormSchema} from '../Project.data';
import {saveOrUpdate} from '../Project.api';
export default defineComponent({
name: "ProjectForm",
components:{
BasicForm
},
props:{
formData: propTypes.object.def({}),
formBpm: propTypes.bool.def(true),
},
setup(props){
const [registerForm, { setFieldsValue, setProps, getFieldsValue }] = useForm({
labelWidth: 150,
schemas: getBpmFormSchema(props.formData),
showActionButtonGroup: false,
baseColProps: {span: 24}
});
const formDisabled = computed(()=>{
if(props.formData.disabled === false){
return false;
}
return true;
});
let formData = {};
const queryByIdUrl = '/project/project/queryById';
async function initFormData(){
let params = {id: props.formData.dataId};
const data = await defHttp.get({url: queryByIdUrl, params});
formData = {...data}
//
await setFieldsValue(formData);
//
await setProps({disabled: formDisabled.value})
}
async function submitForm() {
let data = getFieldsValue();
let params = Object.assign({}, formData, data);
console.log('表单数据', params)
await saveOrUpdate(params, true)
}
initFormData();
return {
registerForm,
formDisabled,
submitForm,
}
}
});
</script>

@ -0,0 +1,76 @@
<template>
<BasicModal v-bind="$attrs" @register="registerModal" destroyOnClose :title="title" :width="800" @ok="handleSubmit">
<BasicForm @register="registerForm" name="ProjectForm" />
</BasicModal>
</template>
<script lang="ts" setup>
import {ref, computed, unref} from 'vue';
import {BasicModal, useModalInner} from '/@/components/Modal';
import {BasicForm, useForm} from '/@/components/Form/index';
import {formSchema} from '../Project.data';
import {saveOrUpdate} from '../Project.api';
// Emits
const emit = defineEmits(['register','success']);
const isUpdate = ref(true);
const isDetail = ref(false);
//
const [registerForm, { setProps,resetFields, setFieldsValue, validate, scrollToField }] = useForm({
labelWidth: 150,
schemas: formSchema,
showActionButtonGroup: false,
baseColProps: {span: 24}
});
//
const [registerModal, {setModalProps, closeModal}] = useModalInner(async (data) => {
//
await resetFields();
setModalProps({confirmLoading: false,showCancelBtn:!!data?.showFooter,showOkBtn:!!data?.showFooter});
isUpdate.value = !!data?.isUpdate;
isDetail.value = !!data?.showFooter;
if (unref(isUpdate)) {
//
await setFieldsValue({
...data.record,
});
}
//
setProps({ disabled: !data?.showFooter })
});
//
const title = computed(() => (!unref(isUpdate) ? '新增' : !unref(isDetail) ? '详情' : '编辑'));
//
async function handleSubmit(v) {
try {
let values = await validate();
setModalProps({confirmLoading: true});
//
await saveOrUpdate(values, isUpdate.value);
//
closeModal();
//
emit('success');
} catch ({ errorFields }) {
if (errorFields) {
const firstField = errorFields[0];
if (firstField) {
scrollToField(firstField.name, { behavior: 'smooth', block: 'center' });
}
}
return Promise.reject(errorFields);
} finally {
setModalProps({confirmLoading: false});
}
}
</script>
<style lang="less" scoped>
/** 时间和数字输入框样式 */
:deep(.ant-input-number) {
width: 100%;
}
:deep(.ant-calendar-picker) {
width: 100%;
}
</style>

@ -0,0 +1,246 @@
<template>
<div>
<!--引用表格-->
<BasicTable @register="registerTable" :rowSelection="rowSelection">
<!--插槽:table标题-->
<template #tableTitle>
<a-button type="primary" preIcon="ant-design:export-outlined" @click="onExportXls"> 导出
</a-button>
</template>
<!--操作栏-->
<template #action="{ record }">
<TableAction :actions="getTableAction(record)"/>
</template>
<!--字段回显插槽-->
<template v-slot:bodyCell="{ column, record, index, text }">
</template>
</BasicTable>
<!-- 表单区域 -->
<ProjectModal @register="registerModal" @success="handleSuccess"></ProjectModal>
</div>
</template>
<script lang="ts" name="project-project" setup>
import {reactive, ref} from 'vue';
import {BasicTable, TableAction} from '@/components/Table';
import {useModal} from '@/components/Modal';
import {useListPage} from '@/hooks/system/useListPage'
import ProjectModal from './components/ProjectModal.vue'
import {columns, searchFormSchema, superQuerySchema} from './Project.data';
import {
batchDelete,
deleteOne,
getExportUrl,
getImportUrl,
list4Audit,
rollbackOne,
submitOne
} from './Project.api';
import {useGo} from '@/hooks/web/usePage';
import {useUserStore} from '@/store/modules/user';
const go = useGo();
const queryParam = reactive<any>({});
const checkedKeys = ref<Array<string | number>>([]);
const userStore = useUserStore();
//model
const [registerModal, {openModal}] = useModal();
//table
const {prefixCls, tableContext, onExportXls, onImportXls} = useListPage({
tableProps: {
title: '项目表',
api: list4Audit,
columns,
canResize: false,
formConfig: {
//labelWidth: 120,
schemas: searchFormSchema,
autoSubmitOnEnter: true,
showAdvancedButton: true,
fieldMapToNumber: [],
fieldMapToTime: [],
},
actionColumn: {
width: 320,
fixed: 'right'
},
beforeFetch: (params) => {
return Object.assign(params, queryParam);
},
},
exportConfig: {
name: "项目表",
url: getExportUrl,
params: queryParam,
},
importConfig: {
url: getImportUrl,
success: handleSuccess
},
})
//
//
const RANGE_OPTIONS = [
{key: 'TODAY', label: '今天'},
{key: 'YESTERDAY', label: '昨天'},
{key: 'TOMORROW', label: '明天'},
{key: 'THIS_WEEK', label: '本周'},
{key: 'LAST_WEEK', label: '上周'},
{key: 'NEXT_WEEK', label: '下周'},
{key: 'LAST_7_DAYS', label: '过去七天'},
{key: 'THIS_MONTH', label: '本月'},
{key: 'LAST_MONTH', label: '上月'},
{key: 'NEXT_MONTH', label: '下月'},
];
const [registerTable, {reload}, {rowSelection, selectedRowKeys}] = tableContext
//
const superQueryConfig = reactive(superQuerySchema);
/**
* 高级查询事件
*/
function handleSuperQuery(params) {
Object.keys(params).map((k) => {
queryParam[k] = params[k];
});
reload();
}
/**
* 新增事件
*/
function handleAdd() {
openModal(true, {
isUpdate: false,
showFooter: true,
});
}
//
function go_xinjianshenbao() {
// go('/comp/jeecg/basic');
go('/projectApplication/index?projectTypeId=' + '1846744340708184065');
}
//
function go_xiangmushu(record) {
// go('/comp/jeecg/basic?id=' +'666');
go('/projectApplication/kejigongguan/xiangmushu?id=' + record.id);
}
//
function go_yusuanshu(record) {
// go('/comp/jeecg/basic?id=' +'666');
go('/projectApplication/kejigongguan/yusuanshu?id=' + record.id);
}
/**
* 编辑事件
*/
function handleEdit(record: Recordable) {
openModal(true, {
record,
isUpdate: true,
showFooter: true,
});
}
/**
* 详情
*/
function handleDetail(record: Recordable) {
openModal(true, {
record,
isUpdate: true,
showFooter: false,
});
}
/**
* 删除事件
*/
async function handleDelete(record) {
await deleteOne({id: record.id}, handleSuccess);
}
//
async function handleSubmitOne(record) {
await submitOne({id: record.id}, handleSuccess);
}
//
async function handleRollbackOne(record) {
await rollbackOne({id: record.id}, handleSuccess);
}
/**
* 批量删除事件
*/
async function batchHandleDelete() {
await batchDelete({ids: selectedRowKeys.value}, handleSuccess);
}
/**
* 成功回调
*/
function handleSuccess() {
(selectedRowKeys.value = []) && reload();
}
/**
* 操作栏
*/
function getTableAction(record) {
const actions = [
{
label: '项目书',
onClick: go_xiangmushu.bind(null, record),
// auth: 'projecttype:project_type:edit'
},
{
label: '预算书',
onClick: go_yusuanshu.bind(null, record),
// auth: 'projecttype:project_type:edit'
},
{
label: '详情',
onClick: handleDetail.bind(null, record),
}];
//
if (record.budgetStatus == 9) {
actions.unshift({
label: '通过',
onClick: handleSubmitOne.bind(null, record),
},
{
label: '驳回',
onClick: handleRollbackOne.bind(null, record),
});
}
//projectStatus
//('', '1');
//('', '2');
//('', '3');
//('', '4');
//('', '5');
//('', '6');
//('', '7');
//('', '8');
return actions;
}
</script>
<style lang="less" scoped>
:deep(.ant-picker), :deep(.ant-input-number) {
width: 100%;
}
</style>

@ -0,0 +1,246 @@
<template>
<div>
<!--引用表格-->
<BasicTable @register="registerTable" :rowSelection="rowSelection">
<!--插槽:table标题-->
<template #tableTitle>
<a-button type="primary" preIcon="ant-design:export-outlined" @click="onExportXls"> 导出
</a-button>
</template>
<!--操作栏-->
<template #action="{ record }">
<TableAction :actions="getTableAction(record)"/>
</template>
<!--字段回显插槽-->
<template v-slot:bodyCell="{ column, record, index, text }">
</template>
</BasicTable>
<!-- 表单区域 -->
<ProjectModal @register="registerModal" @success="handleSuccess"></ProjectModal>
</div>
</template>
<script lang="ts" name="project-project" setup>
import {reactive, ref} from 'vue';
import {BasicTable, TableAction} from '@/components/Table';
import {useModal} from '@/components/Modal';
import {useListPage} from '@/hooks/system/useListPage'
import ProjectModal from './components/ProjectModal.vue'
import {columns, searchFormSchema, superQuerySchema} from './Project.data';
import {
batchDelete,
deleteOne,
getExportUrl,
getImportUrl,
list4Audit,
rollbackOne,
submitOne
} from './Project.api';
import {useGo} from '@/hooks/web/usePage';
import {useUserStore} from '@/store/modules/user';
const go = useGo();
const queryParam = reactive<any>({});
const checkedKeys = ref<Array<string | number>>([]);
const userStore = useUserStore();
//model
const [registerModal, {openModal}] = useModal();
//table
const {prefixCls, tableContext, onExportXls, onImportXls} = useListPage({
tableProps: {
title: '项目表',
api: list4Audit,
columns,
canResize: false,
formConfig: {
//labelWidth: 120,
schemas: searchFormSchema,
autoSubmitOnEnter: true,
showAdvancedButton: true,
fieldMapToNumber: [],
fieldMapToTime: [],
},
actionColumn: {
width: 320,
fixed: 'right'
},
beforeFetch: (params) => {
return Object.assign(params, queryParam);
},
},
exportConfig: {
name: "项目表",
url: getExportUrl,
params: queryParam,
},
importConfig: {
url: getImportUrl,
success: handleSuccess
},
})
//
//
const RANGE_OPTIONS = [
{key: 'TODAY', label: '今天'},
{key: 'YESTERDAY', label: '昨天'},
{key: 'TOMORROW', label: '明天'},
{key: 'THIS_WEEK', label: '本周'},
{key: 'LAST_WEEK', label: '上周'},
{key: 'NEXT_WEEK', label: '下周'},
{key: 'LAST_7_DAYS', label: '过去七天'},
{key: 'THIS_MONTH', label: '本月'},
{key: 'LAST_MONTH', label: '上月'},
{key: 'NEXT_MONTH', label: '下月'},
];
const [registerTable, {reload}, {rowSelection, selectedRowKeys}] = tableContext
//
const superQueryConfig = reactive(superQuerySchema);
/**
* 高级查询事件
*/
function handleSuperQuery(params) {
Object.keys(params).map((k) => {
queryParam[k] = params[k];
});
reload();
}
/**
* 新增事件
*/
function handleAdd() {
openModal(true, {
isUpdate: false,
showFooter: true,
});
}
//
function go_xinjianshenbao() {
// go('/comp/jeecg/basic');
go('/projectApplication/index?projectTypeId=' + '1846744340708184065');
}
//
function go_xiangmushu(record) {
// go('/comp/jeecg/basic?id=' +'666');
go('/projectApplication/kejigongguan/xiangmushu?id=' + record.id);
}
//
function go_yusuanshu(record) {
// go('/comp/jeecg/basic?id=' +'666');
go('/projectApplication/kejigongguan/yusuanshu?id=' + record.id);
}
/**
* 编辑事件
*/
function handleEdit(record: Recordable) {
openModal(true, {
record,
isUpdate: true,
showFooter: true,
});
}
/**
* 详情
*/
function handleDetail(record: Recordable) {
openModal(true, {
record,
isUpdate: true,
showFooter: false,
});
}
/**
* 删除事件
*/
async function handleDelete(record) {
await deleteOne({id: record.id}, handleSuccess);
}
//
async function handleSubmitOne(record) {
await submitOne({id: record.id}, handleSuccess);
}
//
async function handleRollbackOne(record) {
await rollbackOne({id: record.id}, handleSuccess);
}
/**
* 批量删除事件
*/
async function batchHandleDelete() {
await batchDelete({ids: selectedRowKeys.value}, handleSuccess);
}
/**
* 成功回调
*/
function handleSuccess() {
(selectedRowKeys.value = []) && reload();
}
/**
* 操作栏
*/
function getTableAction(record) {
const actions = [
{
label: '项目书',
onClick: go_xiangmushu.bind(null, record),
// auth: 'projecttype:project_type:edit'
},
{
label: '预算书',
onClick: go_yusuanshu.bind(null, record),
// auth: 'projecttype:project_type:edit'
},
{
label: '详情',
onClick: handleDetail.bind(null, record),
}];
//
if (record.projectStatus == 6) {
actions.unshift({
label: '通过',
onClick: handleSubmitOne.bind(null, record),
},
{
label: '驳回',
onClick: handleRollbackOne.bind(null, record),
});
}
//projectStatus
//('', '1');
//('', '2');
//('', '3');
//('', '4');
//('', '5');
//('', '6');
//('', '7');
//('', '8');
return actions;
}
</script>
<style lang="less" scoped>
:deep(.ant-picker), :deep(.ant-input-number) {
width: 100%;
}
</style>

@ -0,0 +1,246 @@
<template>
<div>
<!--引用表格-->
<BasicTable @register="registerTable" :rowSelection="rowSelection">
<!--插槽:table标题-->
<template #tableTitle>
<a-button type="primary" preIcon="ant-design:export-outlined" @click="onExportXls"> 导出
</a-button>
</template>
<!--操作栏-->
<template #action="{ record }">
<TableAction :actions="getTableAction(record)"/>
</template>
<!--字段回显插槽-->
<template v-slot:bodyCell="{ column, record, index, text }">
</template>
</BasicTable>
<!-- 表单区域 -->
<ProjectModal @register="registerModal" @success="handleSuccess"></ProjectModal>
</div>
</template>
<script lang="ts" name="project-project" setup>
import {reactive, ref} from 'vue';
import {BasicTable, TableAction} from '@/components/Table';
import {useModal} from '@/components/Modal';
import {useListPage} from '@/hooks/system/useListPage'
import ProjectModal from './components/ProjectModal.vue'
import {columns, searchFormSchema, superQuerySchema} from './Project.data';
import {
batchDelete,
deleteOne,
getExportUrl,
getImportUrl,
list4Audit,
rollbackOne,
submitOne
} from './Project.api';
import {useGo} from '@/hooks/web/usePage';
import {useUserStore} from '@/store/modules/user';
const go = useGo();
const queryParam = reactive<any>({});
const checkedKeys = ref<Array<string | number>>([]);
const userStore = useUserStore();
//model
const [registerModal, {openModal}] = useModal();
//table
const {prefixCls, tableContext, onExportXls, onImportXls} = useListPage({
tableProps: {
title: '项目表',
api: list4Audit,
columns,
canResize: false,
formConfig: {
//labelWidth: 120,
schemas: searchFormSchema,
autoSubmitOnEnter: true,
showAdvancedButton: true,
fieldMapToNumber: [],
fieldMapToTime: [],
},
actionColumn: {
width: 320,
fixed: 'right'
},
beforeFetch: (params) => {
return Object.assign(params, queryParam);
},
},
exportConfig: {
name: "项目表",
url: getExportUrl,
params: queryParam,
},
importConfig: {
url: getImportUrl,
success: handleSuccess
},
})
//
//
const RANGE_OPTIONS = [
{key: 'TODAY', label: '今天'},
{key: 'YESTERDAY', label: '昨天'},
{key: 'TOMORROW', label: '明天'},
{key: 'THIS_WEEK', label: '本周'},
{key: 'LAST_WEEK', label: '上周'},
{key: 'NEXT_WEEK', label: '下周'},
{key: 'LAST_7_DAYS', label: '过去七天'},
{key: 'THIS_MONTH', label: '本月'},
{key: 'LAST_MONTH', label: '上月'},
{key: 'NEXT_MONTH', label: '下月'},
];
const [registerTable, {reload}, {rowSelection, selectedRowKeys}] = tableContext
//
const superQueryConfig = reactive(superQuerySchema);
/**
* 高级查询事件
*/
function handleSuperQuery(params) {
Object.keys(params).map((k) => {
queryParam[k] = params[k];
});
reload();
}
/**
* 新增事件
*/
function handleAdd() {
openModal(true, {
isUpdate: false,
showFooter: true,
});
}
//
function go_xinjianshenbao() {
// go('/comp/jeecg/basic');
go('/projectApplication/index?projectTypeId=' + '1846744340708184065');
}
//
function go_xiangmushu(record) {
// go('/comp/jeecg/basic?id=' +'666');
go('/projectApplication/kejigongguan/xiangmushu?id=' + record.id);
}
//
function go_yusuanshu(record) {
// go('/comp/jeecg/basic?id=' +'666');
go('/projectApplication/kejigongguan/yusuanshu?id=' + record.id);
}
/**
* 编辑事件
*/
function handleEdit(record: Recordable) {
openModal(true, {
record,
isUpdate: true,
showFooter: true,
});
}
/**
* 详情
*/
function handleDetail(record: Recordable) {
openModal(true, {
record,
isUpdate: true,
showFooter: false,
});
}
/**
* 删除事件
*/
async function handleDelete(record) {
await deleteOne({id: record.id}, handleSuccess);
}
//
async function handleSubmitOne(record) {
await submitOne({id: record.id}, handleSuccess);
}
//
async function handleRollbackOne(record) {
await rollbackOne({id: record.id}, handleSuccess);
}
/**
* 批量删除事件
*/
async function batchHandleDelete() {
await batchDelete({ids: selectedRowKeys.value}, handleSuccess);
}
/**
* 成功回调
*/
function handleSuccess() {
(selectedRowKeys.value = []) && reload();
}
/**
* 操作栏
*/
function getTableAction(record) {
const actions = [
{
label: '项目书',
onClick: go_xiangmushu.bind(null, record),
// auth: 'projecttype:project_type:edit'
},
{
label: '预算书',
onClick: go_yusuanshu.bind(null, record),
// auth: 'projecttype:project_type:edit'
},
{
label: '详情',
onClick: handleDetail.bind(null, record),
}];
//
if (record.projectStatus == 7) {
actions.unshift({
label: '通过',
onClick: handleSubmitOne.bind(null, record),
},
{
label: '驳回',
onClick: handleRollbackOne.bind(null, record),
});
}
//projectStatus
//('', '1');
//('', '2');
//('', '3');
//('', '4');
//('', '5');
//('', '6');
//('', '7');
//('', '8');
return actions;
}
</script>
<style lang="less" scoped>
:deep(.ant-picker), :deep(.ant-input-number) {
width: 100%;
}
</style>

@ -0,0 +1,245 @@
<template>
<div>
<!--引用表格-->
<BasicTable @register="registerTable" :rowSelection="rowSelection">
<!--插槽:table标题-->
<template #tableTitle>
<a-button type="primary" preIcon="ant-design:export-outlined" @click="onExportXls"> 导出
</a-button>
</template>
<!--操作栏-->
<template #action="{ record }">
<TableAction :actions="getTableAction(record)"/>
</template>
<!--字段回显插槽-->
<template v-slot:bodyCell="{ column, record, index, text }">
</template>
</BasicTable>
<!-- 表单区域 -->
<ProjectModal @register="registerModal" @success="handleSuccess"></ProjectModal>
</div>
</template>
<script lang="ts" name="project-project" setup>
import {reactive, ref} from 'vue';
import {BasicTable, TableAction} from '@/components/Table';
import {useModal} from '@/components/Modal';
import {useListPage} from '@/hooks/system/useListPage'
import ProjectModal from './components/ProjectModal.vue'
import {columns, searchFormSchema, superQuerySchema} from './Project.data';
import {
batchDelete,
deleteOne,
getExportUrl,
getImportUrl,
list4Audit,
rollbackOne,
submitOne
} from './Project.api';
import {useGo} from '@/hooks/web/usePage';
import {useUserStore} from '@/store/modules/user';
const go = useGo();
const queryParam = reactive<any>({});
const checkedKeys = ref<Array<string | number>>([]);
const userStore = useUserStore();
//model
const [registerModal, {openModal}] = useModal();
//table
const {prefixCls, tableContext, onExportXls, onImportXls} = useListPage({
tableProps: {
title: '项目表',
api: list4Audit,
columns,
canResize: false,
formConfig: {
//labelWidth: 120,
schemas: searchFormSchema,
autoSubmitOnEnter: true,
showAdvancedButton: true,
fieldMapToNumber: [],
fieldMapToTime: [],
},
actionColumn: {
width: 320,
fixed: 'right'
},
beforeFetch: (params) => {
return Object.assign(params, queryParam);
},
},
exportConfig: {
name: "项目表",
url: getExportUrl,
params: queryParam,
},
importConfig: {
url: getImportUrl,
success: handleSuccess
},
})
//
//
const RANGE_OPTIONS = [
{key: 'TODAY', label: '今天'},
{key: 'YESTERDAY', label: '昨天'},
{key: 'TOMORROW', label: '明天'},
{key: 'THIS_WEEK', label: '本周'},
{key: 'LAST_WEEK', label: '上周'},
{key: 'NEXT_WEEK', label: '下周'},
{key: 'LAST_7_DAYS', label: '过去七天'},
{key: 'THIS_MONTH', label: '本月'},
{key: 'LAST_MONTH', label: '上月'},
{key: 'NEXT_MONTH', label: '下月'},
];
const [registerTable, {reload}, {rowSelection, selectedRowKeys}] = tableContext
//
const superQueryConfig = reactive(superQuerySchema);
/**
* 高级查询事件
*/
function handleSuperQuery(params) {
Object.keys(params).map((k) => {
queryParam[k] = params[k];
});
reload();
}
/**
* 新增事件
*/
function handleAdd() {
openModal(true, {
isUpdate: false,
showFooter: true,
});
}
//
function go_xinjianshenbao() {
// go('/comp/jeecg/basic');
go('/projectApplication/index?projectTypeId=' + '1846744340708184065');
}
//
function go_xiangmushu(record) {
// go('/comp/jeecg/basic?id=' +'666');
go('/projectApplication/kejigongguan/xiangmushu?id=' + record.id);
}
//
function go_yusuanshu(record) {
// go('/comp/jeecg/basic?id=' +'666');
go('/projectApplication/kejigongguan/yusuanshu?id=' + record.id);
}
/**
* 编辑事件
*/
function handleEdit(record: Recordable) {
openModal(true, {
record,
isUpdate: true,
showFooter: true,
});
}
/**
* 详情
*/
function handleDetail(record: Recordable) {
openModal(true, {
record,
isUpdate: true,
showFooter: false,
});
}
/**
* 删除事件
*/
async function handleDelete(record) {
await deleteOne({id: record.id}, handleSuccess);
}
//
async function handleSubmitOne(record) {
await submitOne({id: record.id}, handleSuccess);
}
//
async function handleRollbackOne(record) {
await rollbackOne({id: record.id}, handleSuccess);
}
/**
* 批量删除事件
*/
async function batchHandleDelete() {
await batchDelete({ids: selectedRowKeys.value}, handleSuccess);
}
/**
* 成功回调
*/
function handleSuccess() {
(selectedRowKeys.value = []) && reload();
}
/**
* 操作栏
*/
function getTableAction(record) {
const actions = [
{
label: '项目书',
onClick: go_xiangmushu.bind(null, record),
// auth: 'projecttype:project_type:edit'
},
{
label: '预算书',
onClick: go_yusuanshu.bind(null, record),
// auth: 'projecttype:project_type:edit'
},
{
label: '详情',
onClick: handleDetail.bind(null, record),
}];
if (record.projectStatus == 1) {
actions.unshift({
label: '通过',
onClick: handleSubmitOne.bind(null, record),
},
{
label: '驳回',
onClick: handleRollbackOne.bind(null, record),
});
}
//projectStatus
//('', '1');
//('', '2');
//('', '3');
//('', '4');
//('', '5');
//('', '6');
//('', '7');
//('', '8');
return actions;
}
</script>
<style lang="less" scoped>
:deep(.ant-picker), :deep(.ant-input-number) {
width: 100%;
}
</style>

@ -6,15 +6,21 @@ const {createConfirm} = useMessage();
enum Api {
list = '/project/project/list',
projectType = '/projectType/getProjectTypeList',
departBaseInfo = '/projectType/getDepartBaseInfo',
departDtoInfo = '/project/project/getDepartDtoInfo',
save = '/project/project/add',
edit = '/project/project/edit',
deleteOne = '/project/project/delete',
submitOne = '/project/project/submitApply',
rollbackOne = '/project/project/rollbackProject',
deleteBatch = '/project/project/deleteBatch',
importExcel = '/project/project/importExcel',
exportXls = '/project/project/exportXls',
}
export const getDepartDtoByProjectId = (params) =>
defHttp.get({url: Api.departDtoInfo, params});
/**
* 导出api
* @param params
@ -47,6 +53,20 @@ export const deleteOne = (params, handleSuccess) => {
handleSuccess();
});
}
export const submitOne = (params, handleSuccess) => {
return defHttp.post({url: Api.submitOne, params}, {joinParamsToUrl: true}).then(() => {
handleSuccess();
});
}
export const rollbackOne = (params, handleSuccess) => {
return defHttp.post({url: Api.rollbackOne, params}, {joinParamsToUrl: true}).then(() => {
handleSuccess();
});
}
/**
* 批量删除
* @param params

@ -12,25 +12,25 @@ import {forEach} from "@/utils/helper/treeHelper";
//
export const columns: BasicColumn[] = [
{
title: '所属部门',
title: '项目名称',
align: "center",
dataIndex: 'sysOrgCode_dictText'
dataIndex: 'projectName'
},
{
title: '负责人',
title: '项目类别',
align: "center",
dataIndex: 'projectCharger_dictText'
// dataIndex: 'projectTypeid_dictText'
dataIndex: 'projectTypeid_dictText'
},
{
title: '项目名称',
title: '申请单位',
align: "center",
dataIndex: 'projectName'
dataIndex: 'sysOrgCode_dictText'
},
{
title: '项目类别',
title: '负责人',
align: "center",
// dataIndex: 'projectTypeid_dictText'
dataIndex: 'projectTypeid_dictText'
dataIndex: 'projectCharger_dictText'
},
{
title: '项目书状态',
@ -92,7 +92,7 @@ export const searchFormSchema: FormSchema[] = [
},
//colProps: {span: 6},
},
{
/*{
label: "预算书状态",
field: 'budgetStatus',
component: 'JDictSelectTag',
@ -100,7 +100,7 @@ export const searchFormSchema: FormSchema[] = [
dictCode: "budget_status"
},
//colProps: {span: 6},
},
},*/
];
//
export const formSchema: FormSchema[] = [

@ -54,6 +54,8 @@ import {columns, searchFormSchema, superQuerySchema} from './Project.data';
import {
list,
deleteOne,
rollbackOne,
submitOne,
batchDelete,
getImportUrl,
getExportUrl,
@ -90,7 +92,7 @@ const { prefixCls,tableContext,onExportXls,onImportXls } = useListPage({
],
},
actionColumn: {
width: 280,
width: 320,
fixed:'right'
},
beforeFetch: (params) => {
@ -128,14 +130,6 @@ const [registerTable, {reload},{ rowSelection, selectedRowKeys }] = tableContext
//
const superQueryConfig = reactive(superQuerySchema);
// onMounted(() => {
// let typeList = getProjectTypeList();
// console.log('typeList',typeList)
// RANGE_OPTIONS = typeList;
// });
/**
* 高级查询事件
*/
@ -200,6 +194,16 @@ function handleDetail(record: Recordable) {
async function handleDelete(record) {
await deleteOne({id: record.id}, handleSuccess);
}
//
async function handleSubmitOne(record) {
await submitOne({id: record.id}, handleSuccess);
}
//
async function handleRollbackOne(record) {
await rollbackOne({id: record.id}, handleSuccess);
}
/**
* 批量删除事件
*/
@ -230,23 +234,40 @@ function getTableAction(record){
{
label: '详情',
onClick: handleDetail.bind(null, record),
},
{
label: '删除',
popConfirm: {
title: '是否确认删除',
confirm: handleDelete.bind(null, record),
placement: 'topLeft',
},
// auth: 'projecttype:project_type:delete'
}];
//
/*if (record.projectStatus == 5) {
//()
if (record.projectStatus == 5) {
actions.unshift({
label: '删除',
popConfirm: {
title: '是否确认删除',
confirm: handleDelete.bind(null, record),
placement: 'topLeft',
},
});
}
if (record.projectStatus == 5) {
actions.unshift({
label: '提交项目',
onClick: handleSubmitOne.bind(null, record),
});
}
//projectStatus
//('', '1');
//('', '2');
//('', '3');
//('', '4');
//('', '5');
//('', '6');
//('', '7');
//('', '8');
if (record.projectStatus ==6) {
// console.log("jjjjjjjjj",JSON.stringify(userStore.getUserInfo.roles))
actions.unshift({
label: '编辑',
onClick: handleEdit.bind(null, record),
label: '取回项目',
onClick: handleRollbackOne.bind(null, record),
});
}*/
}
return actions;
}
/**

@ -0,0 +1,64 @@
import {defHttp} from '/@/utils/http/axios';
import { useMessage } from "/@/hooks/web/useMessage";
const { createConfirm } = useMessage();
enum Api {
list = '/projectLog/projectLog/list',
save='/projectLog/projectLog/add',
edit='/projectLog/projectLog/edit',
deleteOne = '/projectLog/projectLog/delete',
deleteBatch = '/projectLog/projectLog/deleteBatch',
importExcel = '/projectLog/projectLog/importExcel',
exportXls = '/projectLog/projectLog/exportXls',
}
/**
* 导出api
* @param params
*/
export const getExportUrl = Api.exportXls;
/**
* 导入api
*/
export const getImportUrl = Api.importExcel;
/**
* 列表接口
* @param params
*/
export const list = (params) =>
defHttp.get({url: Api.list, params});
/**
* 删除单个
*/
export const deleteOne = (params,handleSuccess) => {
return defHttp.delete({url: Api.deleteOne, params}, {joinParamsToUrl: true}).then(() => {
handleSuccess();
});
}
/**
* 批量删除
* @param params
*/
export const batchDelete = (params, handleSuccess) => {
createConfirm({
iconType: 'warning',
title: '确认删除',
content: '是否删除选中数据',
okText: '确认',
cancelText: '取消',
onOk: () => {
return defHttp.delete({url: Api.deleteBatch, data: params}, {joinParamsToUrl: true}).then(() => {
handleSuccess();
});
}
});
}
/**
* 保存或者更新
* @param params
*/
export const saveOrUpdate = (params, isUpdate) => {
let url = isUpdate ? Api.edit : Api.save;
return defHttp.post({url: url, params});
}

@ -0,0 +1,112 @@
import {BasicColumn} from '/@/components/Table';
import {FormSchema} from '/@/components/Table';
import { rules} from '/@/utils/helper/validator';
import { render } from '/@/utils/common/renderUtils';
import { getWeekMonthQuarterYear } from '/@/utils';
//
export const columns: BasicColumn[] = [
{
title: '项目名称',
align:"center",
dataIndex: 'projectName'
},
{
title: '操作说明',
align:"center",
dataIndex: 'operationMark'
},
{
title: '操作时间',
align:"center",
dataIndex: 'operationTime'
},
{
title: '操作人名称',
align:"center",
dataIndex: 'operatorName'
},
{
title: '项目书状态',
align:"center",
dataIndex: 'projectStatus_dictText'
},
{
title: '预算书状态',
align:"center",
dataIndex: 'budgetStatus_dictText'
},
];
//
export const searchFormSchema: FormSchema[] = [
];
//
export const formSchema: FormSchema[] = [
{
label: '项目名称',
field: 'projectName',
component: 'Input',
},
{
label: '操作说明',
field: 'operationMark',
component: 'Input',
},
{
label: '操作时间',
field: 'operationTime',
component: 'DatePicker',
componentProps: {
showTime: true,
valueFormat: 'YYYY-MM-DD HH:mm:ss'
},
},
{
label: '操作人名称',
field: 'operatorName',
component: 'Input',
},
{
label: '项目书状态',
field: 'projectStatus',
component: 'JDictSelectTag',
componentProps:{
dictCode:"project_status",
type: "radio"
},
},
{
label: '预算书状态',
field: 'budgetStatus',
component: 'JDictSelectTag',
componentProps:{
dictCode:"budget_status",
type: "radio"
},
},
// TODO ID
{
label: '',
field: 'id',
component: 'Input',
show: false
},
];
//
export const superQuerySchema = {
projectName: {title: '项目名称',order: 0,view: 'text', type: 'string',},
operationMark: {title: '操作说明',order: 1,view: 'text', type: 'string',},
operationTime: {title: '操作时间',order: 2,view: 'datetime', type: 'string',},
operatorName: {title: '操作人名称',order: 3,view: 'text', type: 'string',},
projectStatus: {title: '项目书状态',order: 4,view: 'radio', type: 'string',dictCode: 'project_status',},
budgetStatus: {title: '预算书状态',order: 5,view: 'radio', type: 'string',dictCode: 'budget_status',},
};
/**
* 流程表单调用这个方法获取formSchema
* @param param
*/
export function getBpmFormSchema(_formData): FormSchema[]{
// formSchema
return formSchema;
}

@ -0,0 +1,190 @@
<template>
<div>
<!--引用表格-->
<BasicTable @register="registerTable" :rowSelection="rowSelection">
<!--插槽:table标题-->
<template #tableTitle>
<a-button type="primary" v-auth="'projectLog:project_log:add'" @click="handleAdd" preIcon="ant-design:plus-outlined"> 新增</a-button>
<a-button type="primary" v-auth="'projectLog:project_log:exportXls'" preIcon="ant-design:export-outlined" @click="onExportXls"> 导出</a-button>
<j-upload-button type="primary" v-auth="'projectLog:project_log:importExcel'" preIcon="ant-design:import-outlined" @click="onImportXls">导入</j-upload-button>
<a-dropdown v-if="selectedRowKeys.length > 0">
<template #overlay>
<a-menu>
<a-menu-item key="1" @click="batchHandleDelete">
<Icon icon="ant-design:delete-outlined"></Icon>
删除
</a-menu-item>
</a-menu>
</template>
<a-button v-auth="'projectLog:project_log:deleteBatch'">批量操作
<Icon icon="mdi:chevron-down"></Icon>
</a-button>
</a-dropdown>
<!-- 高级查询 -->
<super-query :config="superQueryConfig" @search="handleSuperQuery" />
</template>
<!--操作栏-->
<template #action="{ record }">
<TableAction :actions="getTableAction(record)" :dropDownActions="getDropDownAction(record)"/>
</template>
<!--字段回显插槽-->
<template v-slot:bodyCell="{ column, record, index, text }">
</template>
</BasicTable>
<!-- 表单区域 -->
<ProjectLogModal @register="registerModal" @success="handleSuccess"></ProjectLogModal>
</div>
</template>
<script lang="ts" name="projectLog-projectLog" setup>
import {ref, reactive, computed, unref} from 'vue';
import {BasicTable, useTable, TableAction} from '/@/components/Table';
import {useModal} from '/@/components/Modal';
import { useListPage } from '/@/hooks/system/useListPage'
import ProjectLogModal from './components/ProjectLogModal.vue'
import {columns, searchFormSchema, superQuerySchema} from './ProjectLog.data';
import {list, deleteOne, batchDelete, getImportUrl,getExportUrl} from './ProjectLog.api';
import { downloadFile } from '/@/utils/common/renderUtils';
import { useUserStore } from '/@/store/modules/user';
const queryParam = reactive<any>({});
const checkedKeys = ref<Array<string | number>>([]);
const userStore = useUserStore();
//model
const [registerModal, {openModal}] = useModal();
//table
const { prefixCls,tableContext,onExportXls,onImportXls } = useListPage({
tableProps:{
title: '项目操作日志',
api: list,
columns,
canResize:false,
formConfig: {
//labelWidth: 120,
schemas: searchFormSchema,
autoSubmitOnEnter:true,
showAdvancedButton:true,
fieldMapToNumber: [
],
fieldMapToTime: [
],
},
actionColumn: {
width: 120,
fixed:'right'
},
beforeFetch: (params) => {
return Object.assign(params, queryParam);
},
},
exportConfig: {
name:"项目操作日志",
url: getExportUrl,
params: queryParam,
},
importConfig: {
url: getImportUrl,
success: handleSuccess
},
})
const [registerTable, {reload},{ rowSelection, selectedRowKeys }] = tableContext
//
const superQueryConfig = reactive(superQuerySchema);
/**
* 高级查询事件
*/
function handleSuperQuery(params) {
Object.keys(params).map((k) => {
queryParam[k] = params[k];
});
reload();
}
/**
* 新增事件
*/
function handleAdd() {
openModal(true, {
isUpdate: false,
showFooter: true,
});
}
/**
* 编辑事件
*/
function handleEdit(record: Recordable) {
openModal(true, {
record,
isUpdate: true,
showFooter: true,
});
}
/**
* 详情
*/
function handleDetail(record: Recordable) {
openModal(true, {
record,
isUpdate: true,
showFooter: false,
});
}
/**
* 删除事件
*/
async function handleDelete(record) {
await deleteOne({id: record.id}, handleSuccess);
}
/**
* 批量删除事件
*/
async function batchHandleDelete() {
await batchDelete({ids: selectedRowKeys.value}, handleSuccess);
}
/**
* 成功回调
*/
function handleSuccess() {
(selectedRowKeys.value = []) && reload();
}
/**
* 操作栏
*/
function getTableAction(record){
return [
{
label: '编辑',
onClick: handleEdit.bind(null, record),
auth: 'projectLog:project_log:edit'
}
]
}
/**
* 下拉操作栏
*/
function getDropDownAction(record){
return [
{
label: '详情',
onClick: handleDetail.bind(null, record),
}, {
label: '删除',
popConfirm: {
title: '是否确认删除',
confirm: handleDelete.bind(null, record),
placement: 'topLeft',
},
auth: 'projectLog:project_log:delete'
}
]
}
</script>
<style lang="less" scoped>
:deep(.ant-picker),:deep(.ant-input-number){
width: 100%;
}
</style>

@ -0,0 +1,26 @@
-- 注意该页面对应的前台目录为views/projectLog文件夹下
-- 如果你想更改到其他目录请修改sql中component字段对应的值
INSERT INTO sys_permission(id, parent_id, name, url, component, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_route, is_leaf, keep_alive, hidden, hide_tab, description, status, del_flag, rule_flag, create_by, create_time, update_by, update_time, internal_or_external)
VALUES ('2024110405388940100', NULL, '项目操作日志', '/projectLog/projectLogList', 'projectLog/ProjectLogList', NULL, NULL, 0, NULL, '1', 0.00, 0, NULL, 1, 0, 0, 0, 0, NULL, '1', 0, 0, 'admin', '2024-11-04 17:38:10', NULL, NULL, 0);
-- 权限控制sql
-- 新增
INSERT INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external)
VALUES ('2024110405388940101', '2024110405388940100', '添加项目操作日志', NULL, NULL, 0, NULL, NULL, 2, 'projectLog:project_log:add', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2024-11-04 17:38:10', NULL, NULL, 0, 0, '1', 0);
-- 编辑
INSERT INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external)
VALUES ('2024110405388940102', '2024110405388940100', '编辑项目操作日志', NULL, NULL, 0, NULL, NULL, 2, 'projectLog:project_log:edit', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2024-11-04 17:38:10', NULL, NULL, 0, 0, '1', 0);
-- 删除
INSERT INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external)
VALUES ('2024110405388940103', '2024110405388940100', '删除项目操作日志', NULL, NULL, 0, NULL, NULL, 2, 'projectLog:project_log:delete', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2024-11-04 17:38:10', NULL, NULL, 0, 0, '1', 0);
-- 批量删除
INSERT INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external)
VALUES ('2024110405388940104', '2024110405388940100', '批量删除项目操作日志', NULL, NULL, 0, NULL, NULL, 2, 'projectLog:project_log:deleteBatch', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2024-11-04 17:38:10', NULL, NULL, 0, 0, '1', 0);
-- 导出excel
INSERT INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external)
VALUES ('2024110405388940105', '2024110405388940100', '导出excel_项目操作日志', NULL, NULL, 0, NULL, NULL, 2, 'projectLog:project_log:exportXls', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2024-11-04 17:38:10', NULL, NULL, 0, 0, '1', 0);
-- 导入excel
INSERT INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external)
VALUES ('2024110405388940106', '2024110405388940100', '导入excel_项目操作日志', NULL, NULL, 0, NULL, NULL, 2, 'projectLog:project_log:importExcel', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2024-11-04 17:38:10', NULL, NULL, 0, 0, '1', 0);

@ -0,0 +1,70 @@
<template>
<div style="min-height: 400px">
<BasicForm @register="registerForm"></BasicForm>
<div style="width: 100%;text-align: center" v-if="!formDisabled">
<a-button @click="submitForm" pre-icon="ant-design:check" type="primary"> </a-button>
</div>
</div>
</template>
<script lang="ts">
import {BasicForm, useForm} from '/@/components/Form/index';
import {computed, defineComponent} from 'vue';
import {defHttp} from '/@/utils/http/axios';
import { propTypes } from '/@/utils/propTypes';
import {getBpmFormSchema} from '../ProjectLog.data';
import {saveOrUpdate} from '../ProjectLog.api';
export default defineComponent({
name: "ProjectLogForm",
components:{
BasicForm
},
props:{
formData: propTypes.object.def({}),
formBpm: propTypes.bool.def(true),
},
setup(props){
const [registerForm, { setFieldsValue, setProps, getFieldsValue }] = useForm({
labelWidth: 150,
schemas: getBpmFormSchema(props.formData),
showActionButtonGroup: false,
baseColProps: {span: 24}
});
const formDisabled = computed(()=>{
if(props.formData.disabled === false){
return false;
}
return true;
});
let formData = {};
const queryByIdUrl = '/projectLog/projectLog/queryById';
async function initFormData(){
let params = {id: props.formData.dataId};
const data = await defHttp.get({url: queryByIdUrl, params});
formData = {...data}
//
await setFieldsValue(formData);
//
await setProps({disabled: formDisabled.value})
}
async function submitForm() {
let data = getFieldsValue();
let params = Object.assign({}, formData, data);
console.log('表单数据', params)
await saveOrUpdate(params, true)
}
initFormData();
return {
registerForm,
formDisabled,
submitForm,
}
}
});
</script>

@ -0,0 +1,76 @@
<template>
<BasicModal v-bind="$attrs" @register="registerModal" destroyOnClose :title="title" :width="800" @ok="handleSubmit">
<BasicForm @register="registerForm" name="ProjectLogForm" />
</BasicModal>
</template>
<script lang="ts" setup>
import {ref, computed, unref} from 'vue';
import {BasicModal, useModalInner} from '/@/components/Modal';
import {BasicForm, useForm} from '/@/components/Form/index';
import {formSchema} from '../ProjectLog.data';
import {saveOrUpdate} from '../ProjectLog.api';
// Emits
const emit = defineEmits(['register','success']);
const isUpdate = ref(true);
const isDetail = ref(false);
//
const [registerForm, { setProps,resetFields, setFieldsValue, validate, scrollToField }] = useForm({
labelWidth: 150,
schemas: formSchema,
showActionButtonGroup: false,
baseColProps: {span: 24}
});
//
const [registerModal, {setModalProps, closeModal}] = useModalInner(async (data) => {
//
await resetFields();
setModalProps({confirmLoading: false,showCancelBtn:!!data?.showFooter,showOkBtn:!!data?.showFooter});
isUpdate.value = !!data?.isUpdate;
isDetail.value = !!data?.showFooter;
if (unref(isUpdate)) {
//
await setFieldsValue({
...data.record,
});
}
//
setProps({ disabled: !data?.showFooter })
});
//
const title = computed(() => (!unref(isUpdate) ? '新增' : !unref(isDetail) ? '详情' : '编辑'));
//
async function handleSubmit(v) {
try {
let values = await validate();
setModalProps({confirmLoading: true});
//
await saveOrUpdate(values, isUpdate.value);
//
closeModal();
//
emit('success');
} catch ({ errorFields }) {
if (errorFields) {
const firstField = errorFields[0];
if (firstField) {
scrollToField(firstField.name, { behavior: 'smooth', block: 'center' });
}
}
return Promise.reject(errorFields);
} finally {
setModalProps({confirmLoading: false});
}
}
</script>
<style lang="less" scoped>
/** 时间和数字输入框样式 */
:deep(.ant-input-number) {
width: 100%;
}
:deep(.ant-calendar-picker) {
width: 100%;
}
</style>

@ -5,7 +5,7 @@
<div class="app-loading-dots">
<span class="dot dot-spin"><i></i><i></i><i></i><i></i></span>
</div>
<div class="app-loading-title">JeecgBoot 企业级低代码平台</div>
<div class="app-loading-title">科技管理信息系统</div>
</div>
</div>
</template>

Loading…
Cancel
Save