فهرست منبع

Merge branch 'master' of http://47.100.37.243:10191/wutt/manHourHousekeeper

# Conflicts:
#	fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/UserController.java
Min 2 سال پیش
والد
کامیت
7d3b29a0d0

+ 107 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/UserController.java

@@ -405,7 +405,114 @@ public class UserController {
 
     @RequestMapping("/initSystemForAd")
     public HttpRespMsg initSystemForAd(String companyName) throws Exception {
+<<<<<<< HEAD
         return userService.initSystemForAd(companyName);
+=======
+        HttpRespMsg msg = new HttpRespMsg();
+        Company company = new Company().setCompanyName(companyName)
+                .setExpirationDate(LocalDateTime.now().plusDays(36500));
+        company.setPackageWorktime(1);
+        companyMapper.insert(company);
+        //生成工作时长
+        TimeType timeType = new TimeType();
+        timeType.setCompanyId(company.getId());
+        timeTypeMapper.insert(timeType);
+        SysRole smanager = sysRoleService.generateDefaultRoles(company.getId());
+        //生成项目的成本基线默认条目
+        String[] array = Constant.DEFAULT_BASE_COST_ITEMS;
+        for (String baseItem : array) {
+            ProjectBasecostSetting setting = new ProjectBasecostSetting();
+            setting.setName(baseItem);
+            setting.setCompanyId(company.getId());
+            projectBasecostSettingMapper.insert(setting);
+        }
+        //todo: 生成项目报表服务默认条目
+        Integer[] arrayInteger = new Integer[]{1, 2, 3, 4, 7};
+        for (Integer integerItem : arrayInteger) {
+            CompanyReport companyReport = new CompanyReport();
+            companyReport.setCompanyId(company.getId());
+            companyReport.setReportFormId(integerItem);
+            companyReportMapper.insert(companyReport);
+        }
+        SysRole role = sysRoleMapper.selectOne(new QueryWrapper<SysRole>().eq("company_id", company.getId()).eq("rolename","普通员工"));
+        List<JSONObject> deptArrays = userService.ldapGetOU();
+        for (JSONObject dept : deptArrays) {
+            Department department=new Department();
+            department.setDepartmentName(dept.getString("name"))
+                      .setCompanyId(company.getId());
+            String canonicalName = dept.getString("canonicalName");
+            String[] split = canonicalName.split("/");
+            if(split.length>2){
+                String s = split[split.length - 2];
+                Department one = departmentMapper.selectOne(new QueryWrapper<Department>().eq("department_name", s).eq("company_id", company.getId()));
+                if(Optional.of(one).isPresent()){
+                    department.setSuperiorId(one.getDepartmentId());
+                }
+            }
+            departmentMapper.insert(department);
+        }
+        List<Department> departmentList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", company.getId()));
+        List<JSONObject> userArrays = userService.getUser();
+        for (JSONObject user : userArrays) {
+            User u=new User();
+            u.setId(SnowFlake.nextId()+"")
+             .setName(user.getString("name"))
+             .setPhone(user.getString("userPrincipalName"))
+             .setId(SnowFlake.nextId()+"")
+             .setRoleId(role.getId())//默认普通员工
+             .setRoleName(role.getRolename())
+             .setCompanyId(company.getId())
+             .setColor(ColorUtil.randomColor())
+             .setPassword(MD5Util.getPassword("000000"));
+            String distinguishedName = user.getString("distinguishedName");
+            String[] split = distinguishedName.split(",");
+            List<String> list = Arrays.asList(split);
+            List<String> collect = list.stream().filter(l -> l.contains("OU=")).collect(Collectors.toList());
+            if(collect.size()>0){
+                String s = collect.get(0).replaceAll("OU=", "");
+                Department one = departmentMapper.selectOne(new QueryWrapper<Department>().eq("department_name", s).eq("company_id", company.getId()));
+                if(one!=null){
+                    u.setDepartmentId(one.getDepartmentId()).setDepartmentName(one.getDepartmentName()).setDepartmentCascade(convertDepartmentIdToCascade(one.getDepartmentId(),departmentList));
+                }
+                userService.save(u);
+            }
+        }
+        return msg;
+    }
+
+    @RequestMapping("/updateUserDeptHierarchy")
+    public HttpRespMsg updateUserDeptHierarchy(Integer companyId) throws Exception {
+        HttpRespMsg httpRespMsg=new HttpRespMsg();
+        List<User> userList = userService.list(new QueryWrapper<User>().eq("company_id", companyId));
+        List<Department> departmentList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", companyId));
+        List<User> updateUserList = new ArrayList<>();
+        for (User user : userList) {
+            String departmentCascade = convertDepartmentIdToCascade(user.getDepartmentId(), departmentList);
+            user.setDepartmentCascade(departmentCascade);
+            User upUser = new User();
+            upUser.setId(user.getId());
+            upUser.setDepartmentCascade(departmentCascade);
+            updateUserList.add(upUser);
+        }
+        userService.updateBatchById(updateUserList);
+        return httpRespMsg;
+    }
+
+    //将部门id转换为部门层级
+    private String convertDepartmentIdToCascade(Integer id, List<Department> allDeptList) {
+        StringBuilder cascade = new StringBuilder();
+        if (id == 0) {
+            cascade.append("0");
+        } else {
+            cascade.append(id);
+            id = findById(id, allDeptList).getSuperiorId();
+            while (id != null) {
+                cascade.append(",").append(id);
+                id = findById(id, allDeptList).getSuperiorId();
+            }
+        }
+        return cascade.toString();
+>>>>>>> e5e8ccbc655cdfebeb0ce3a15115545fe8aacc24
     }
 
     private Department findById(int id, List<Department> allList) {

+ 3 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ExpenseSheetServiceImpl.java

@@ -808,6 +808,9 @@ public class ExpenseSheetServiceImpl extends ServiceImpl<ExpenseSheetMapper, Exp
         //sumRow.add("合计");
         sumRow.add(MessageUtils.message("entry.total"));
         sumRow.add(sumAmount.setScale(2,BigDecimal.ROUND_UP)+"");
+        for (int i = 0; i < titleList.size() - 2; i++) {
+            sumRow.add("");
+        }
         allList.add(sumRow);
         HttpRespMsg msg = new HttpRespMsg();
         //生成excel文件导出

+ 61 - 58
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java

@@ -861,56 +861,56 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                         }
 
                         //如果不存在基线成本快照,则生成
-                        List<EarningSnapshot> earningSnapshots = earningSnapshotMapper.selectList(new QueryWrapper<EarningSnapshot>().eq("project_id", p.getId()).orderByDesc("id").last("limit 1"));
-                        boolean shouldAdd = false;
-                        if (earningSnapshots.size() == 0) {
-                            shouldAdd = true;
-                        } else {
-                            //检查是否发生变化
-                            String data = earningSnapshots.get(0).getCostData();
-                            if (data == null) {
-                                shouldAdd = true;
-                            } else {
-                                JSONArray oldArray = JSONArray.parseArray(data);
-                                if (oldArray.size() != costList.size()) {
-                                    //条目数量有变化,需要新增
-                                    shouldAdd = true;
-                                } else {
-                                    for (int i=0; i<oldArray.size(); i++) {
-                                        JSONObject jsonObject = oldArray.getJSONObject(i);
-                                        ProjectBasecost projectBasecost = JSONObject.toJavaObject(jsonObject, ProjectBasecost.class);
-                                        Optional<ProjectBasecost> first = costList.stream().filter(cost -> cost.getBaseId().equals(projectBasecost.getBaseId())).findFirst();
-                                        if (first.isPresent()) {
-                                            if (!first.get().getBaseAmount().equals(projectBasecost.getBaseAmount())) {
-                                                shouldAdd = true;
-                                                break;
-                                            }
-                                        } else {
-                                            //有新增的条目,需要增加
-                                            shouldAdd = true;
-                                            break;
-                                        }
-                                    }
-                                }
-
-                            }
-                        }
-
-                        if (shouldAdd) {
-                            EarningSnapshot record = new EarningSnapshot();
-                            record.setProjectId(p.getId());
-                            record.setCreatorId(user.getId());
-                            record.setCreatorName(user.getName());
-                            record.setContractAmount(p.getContractAmount());
-                            record.setCostData(projectBaseCostData);
-                            record.setCostTotal(p.getBudget());
-                            record.setProfit(p.getContractAmount() - p.getBudget());
-                            if (p.getContractAmount() > 0) {
-                                record.setProfitPercent(100.0*(p.getContractAmount() - p.getBudget())/p.getContractAmount());
-                                earningSnapshotMapper.insert(record);
-                            }
+//                        List<EarningSnapshot> earningSnapshots = earningSnapshotMapper.selectList(new QueryWrapper<EarningSnapshot>().eq("project_id", p.getId()).orderByDesc("id").last("limit 1"));
+//                        boolean shouldAdd = false;
+//                        if (earningSnapshots.size() == 0) {
+//                            shouldAdd = true;
+//                        } else {
+//                            //检查是否发生变化
+//                            String data = earningSnapshots.get(0).getCostData();
+//                            if (data == null) {
+//                                shouldAdd = true;
+//                            } else {
+//                                JSONArray oldArray = JSONArray.parseArray(data);
+//                                if (oldArray.size() != costList.size()) {
+//                                    //条目数量有变化,需要新增
+//                                    shouldAdd = true;
+//                                } else {
+//                                    for (int i=0; i<oldArray.size(); i++) {
+//                                        JSONObject jsonObject = oldArray.getJSONObject(i);
+//                                        ProjectBasecost projectBasecost = JSONObject.toJavaObject(jsonObject, ProjectBasecost.class);
+//                                        Optional<ProjectBasecost> first = costList.stream().filter(cost -> cost.getBaseId().equals(projectBasecost.getBaseId())).findFirst();
+//                                        if (first.isPresent()) {
+//                                            if (!first.get().getBaseAmount().equals(projectBasecost.getBaseAmount())) {
+//                                                shouldAdd = true;
+//                                                break;
+//                                            }
+//                                        } else {
+//                                            //有新增的条目,需要增加
+//                                            shouldAdd = true;
+//                                            break;
+//                                        }
+//                                    }
+//                                }
+//
+//                            }
+//                        }
 
-                        }
+//                        if (shouldAdd) {
+//                            EarningSnapshot record = new EarningSnapshot();
+//                            record.setProjectId(p.getId());
+//                            record.setCreatorId(user.getId());
+//                            record.setCreatorName(user.getName());
+//                            record.setContractAmount(p.getContractAmount());
+//                            record.setCostData(projectBaseCostData);
+//                            record.setCostTotal(p.getBudget());
+//                            record.setProfit(p.getContractAmount() - p.getBudget());
+//                            if (p.getContractAmount() > 0) {
+//                                record.setProfitPercent(100.0*(p.getContractAmount() - p.getBudget())/p.getContractAmount());
+//                                earningSnapshotMapper.insert(record);
+//                            }
+//
+//                        }
                     }
                     if (projectKeyNodesData != null) {
                         updateProjectKeyNodesData(projectKeyNodesData, p.getId());
@@ -1096,6 +1096,9 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         for (int i=0;i<array.size(); i++) {
             ProjectBasecost projectBasecost = JSONObject.toJavaObject(array.getJSONObject(i), ProjectBasecost.class);
             projectBasecost.setProjectId(projectId);
+            if (projectBasecost.getBaseAmount() == null) {
+                projectBasecost.setBaseAmount(0.0);
+            }
             Optional<ProjectCurrentcost> first = projectCurrentcostList.stream().filter(pc -> pc.getBaseId().equals(projectBasecost.getBaseId())).findFirst();
             if(first.isPresent()){
                 ProjectCurrentcost projectCurrentcost = first.get();
@@ -10239,9 +10242,9 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     sum.add("合计");
                     sum.add("");
                     sum.add("");
-                    sum.add(pTimeSum.toString());
+                    sum.add(new BigDecimal(pTimeSum).setScale(2, RoundingMode.HALF_UP).toString());
                     sum.add(new BigDecimal(pFteSum).setScale(2, RoundingMode.HALF_UP) + "");
-                    sum.add((monthTime - pTimeSum) + "");
+                    sum.add(new BigDecimal(monthTime - pTimeSum).setScale(2, RoundingMode.HALF_UP).toString());
                     pTimeSum = 0.0F;
                     pFteSum = 0.0F;
                     dataList.add(sum);
@@ -10279,9 +10282,9 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 pSum.add("合计");
                 pSum.add("");
                 pSum.add("");
-                pSum.add(pTimeSum.toString());
+                pSum.add(new BigDecimal(pTimeSum).setScale(2, RoundingMode.HALF_UP).toString());
                 pSum.add(new BigDecimal(pFteSum).setScale(2, RoundingMode.HALF_UP) + "");
-                pSum.add((monthTime - pTimeSum) + "");
+                pSum.add(new BigDecimal(monthTime - pTimeSum).setScale(2, RoundingMode.HALF_UP).toString());
                 pTimeSum = 0.0F;
                 pFteSum = 0.0F;
 
@@ -10293,10 +10296,10 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 sum.add(customName + "合计");
                 sum.add("");
                 sum.add("");
-                sum.add(aTimeSum.toString());
+                sum.add(new BigDecimal((aTimeSum)).setScale(2, RoundingMode.HALF_UP).toString());
                 //sum.add(new BigDecimal(aFteSum).setScale(2, RoundingMode.HALF_UP) + "");
                 sum.add("");
-                sum.add((monthTime - aTimeSum) + "");
+                sum.add(new BigDecimal((monthTime - aTimeSum)).setScale(2, RoundingMode.HALF_UP).toString());
                 pTimeSum = 0.0F;
                 pFteSum = 0.0F;
                 aTimeSum = 0.0F;
@@ -10340,9 +10343,9 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 pSum.add("合计");
                 pSum.add("");
                 pSum.add("");
-                pSum.add(pTimeSum.toString());
+                pSum.add(new BigDecimal(pTimeSum).setScale(2, RoundingMode.HALF_UP) + "");
                 pSum.add(new BigDecimal(pFteSum).setScale(2, RoundingMode.HALF_UP) + "");
-                pSum.add((monthTime - pTimeSum) + "");
+                pSum.add(new BigDecimal((monthTime - pTimeSum)).setScale(2, RoundingMode.HALF_UP).toString());
                 dataList.add(pSum);
 
                 ArrayList<String> sum = new ArrayList<>();
@@ -10354,7 +10357,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 sum.add(aTimeSum.toString());
                 //sum.add(new BigDecimal(aFteSum).setScale(2, RoundingMode.HALF_UP) + "");
                 sum.add("");
-                sum.add((monthTime - aTimeSum) + "");
+                sum.add(new BigDecimal((monthTime - aTimeSum)).setScale(2, RoundingMode.HALF_UP).toString());
                 dataList.add(sum);
             }
         }

+ 24 - 21
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/UserServiceImpl.java

@@ -1538,7 +1538,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
             cascade.append(id);
             Integer superiorId = deptList.stream().filter(d->d.getDepartmentId().equals(id)).findFirst().get().getSuperiorId();
             while (superiorId != null) {
-                cascade.append(",").append(id);
+                cascade.append(",").append(superiorId);
                 final Integer tempId = superiorId;
                 superiorId = deptList.stream().filter(d->d.getDepartmentId().equals(tempId)).findFirst().get().getSuperiorId();
             }
@@ -1706,29 +1706,32 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
                 //httpRespMsg.setError("仅剩余"+canImportNum+"人可添加,请减少本次导入的人员数量或者联系客服提高人数上限。");
                 httpRespMsg.setError(MessageUtils.message("register.peopleNoEnough",canImportNum));
             } else {
-                //校验是否有重复账号
-                if (userMapper.selectCount(new QueryWrapper<User>().in("phone", phoneList)) == 0) {
-                    //检查工号是否在当前公司有重复
-                    if (jobNumList.size() > 0) {
-                        int jobNumCnt = userMapper.selectCount(new QueryWrapper<User>().eq("company_id", companyId).in("job_number", jobNumList));
-                        if (jobNumCnt > 0) {
-                            //有重复的
-                            List<User> jobNumUsers = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId).in("job_number", jobNumList));
-                            String duplicateJobNums = jobNumUsers.stream().map(User::getJobNumber).collect(Collectors.joining(","));
-
-                            //httpRespMsg.setError("工号已存在:"+duplicateJobNums);
-                            httpRespMsg.setError(MessageUtils.message("register.jobNoExist")+duplicateJobNums);
-                        } else {
-                            saveBatch(userList);
+                //校验是否有重复账号,有重复的进行更新,没有重复的进行插入
+                List<User> userPhoneList = userMapper.selectList(new QueryWrapper<User>().in("phone", phoneList));
+                boolean hasNonCompUser = userPhoneList.stream().anyMatch(u->!u.getCompanyId().equals(companyId));
+                if (hasNonCompUser) {
+                    //httpRespMsg.setError("手机号已被其他公司使用,请检查后重试");
+                    httpRespMsg.setError(MessageUtils.message("register.phoneUsed")+":" + userPhoneList.stream().filter(u->!u.getCompanyId().equals(companyId)).map(User::getPhone).collect(Collectors.joining(",")));
+                    return httpRespMsg;
+                }
+
+                for (User oldUser : userPhoneList) {
+                    for (User newUser : userList) {
+                        if (oldUser.getPhone().equals(newUser.getPhone())) {
+                            newUser.setId(oldUser.getId())
+                                    .setPassword(null)
+                                    .setRoleId(null)
+                                    .setRoleName(null)
+                                    .setColor(null)
+                                    .setMonthCost(null)
+                                    .setCost(null)
+                                    .setSalaryType(null);
+                            break;
                         }
                     }
-                } else {
-                    List<User> existList = userMapper.selectList(new QueryWrapper<User>().in("phone", phoneList));
-                    String duplicatePhoneStr = existList.stream().map(User::getPhone).collect(Collectors.joining(","));
-                    //httpRespMsg.setError("手机号有重复 批量新建账号失败:" + duplicatePhoneStr);
-                    httpRespMsg.setError(MessageUtils.message("register.phoneRepeat",duplicatePhoneStr));
-                    /*这里以后可能需要返回重复的手机号的具体信息*/
                 }
+
+                saveOrUpdateBatch(userList);
             }
         } catch (IOException e) {
             e.printStackTrace();

+ 143 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/application-meenyi.yml

@@ -0,0 +1,143 @@
+server:
+  port: 10010
+  tomcat:
+    uri-encoding: utf-8
+    max-http-form-post-size: -1
+    connection-timeout: 18000000s
+spring:
+  servlet:
+    multipart:
+      # 配置上传文件的大小设置
+
+      # Single file max size  即单个文件大小
+      max-file-size: 100MB
+      max-request-size: 100MB
+      location: C:/upload/
+  datasource:
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    url: jdbc:mysql://127.0.0.1:3306/man_mingyi?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&useSSL=false
+    username: root
+    password: meenyi@123!
+    hikari:
+      maximum-pool-size: 60
+      minimum-idle: 10
+      max-lifetime: 180000
+      # 数据库连接超时时间,默认30秒,即30000
+      connection-timeout: 60000
+      connection-test-query: SELECT 1
+    #######redis配置######
+    # redis
+    redis:
+      host: 127.0.0.1
+      port: 6379
+      timeout: 3
+      # password:
+      pool:
+        minIdle: 1
+        maxIdle: 10
+        maxWait: 3
+        maxActive: 8
+  ####全局配置时间返回格式#####
+  jackson:
+    #参数意义:
+    #JsonInclude.Include.ALWAYS       默认
+    #JsonInclude.Include.NON_DEFAULT   属性为默认值不序列化
+    #JsonInclude.Include.NON_EMPTY     属性为 空(””) 或者为 NULL 都不序列化
+    #JsonInclude.Include.NON_NULL      属性为NULL  不序列化
+    default-property-inclusion: ALWAYS
+    time-zone: GMT+8
+    date-format: yyyy-MM-dd HH:mm:ss
+  messages:
+    basename: i18n.messages #配置国际化资源文件路径
+    encoding: UTF-8
+
+  ##AD认证
+  ldap:
+    ##AD服务器IP,默认端口389
+    urls: ldap://172.10.10.180:389
+    ##登录账号
+    username: OA@my.com
+    ##密码
+    password: meenyi.com
+    #distinguishedName的部分节点
+    base:
+      dcFirst: my
+      dcSecond: com
+##########日志配置
+logging:
+  level:
+    root: info
+    org.mybatis: debug
+    java.sql: debug
+    org.springframework.web: trace
+    #打印sql语句
+    com.management.platform.mapper: debug
+  path: D:/worktime/server/log/
+  file: worktime.log
+##########
+mybatis-plus:
+  #  mapper-locations: classpath:mapper/*/*.xml
+  #  #实体扫描,多个package用逗号或者分号分隔
+  #  typeAliasesPackage: com.hssx.cloudmodel
+  global-config:
+    #主键类型  0:"数据库ID自增", 1:"用户输入ID",2:"全局唯一ID (数字类型唯一ID)", 3:"全局唯一ID UUID";
+    id-type: 0
+    #字段策略 0:"忽略判断",1:"非 NULL 判断"),2:"非空判断"
+    field-strategy: 2
+    db-column-underline: true
+    refresh-mapper:
+    #################插入和更新非null判断
+    db-config:
+      insert-strategy: not_null
+      update-strategy: not_null
+  configuration:
+    map-underscore-to-camel-case: true
+    cache-enabled: false
+######mybstis配置#######
+mybatis:
+  type-aliases-package: com.management.platform.entity
+  mapper-locations: mappers/*Mapper.xml
+#####配置图片上传路径####
+upload:
+  path: D:/staticproject/timesheet/upload/
+
+referer:
+  refererDomain:
+    - localhost
+    - mytime.ttkuaiban.com
+
+##actuator健康检查配置
+management:
+  security:
+    enabled:false:
+  server:
+    port: 10012
+  #  endpoints:
+  #    web:
+  #      exposure:
+  #        include: "*"
+
+  health:
+    redis:
+      enabled: false
+    ldap:
+      enabled: false
+
+configEnv:
+  isDev: false
+  # 是否是私有化部署,企业内部应用
+  isPrivateDeploy: true
+
+privateDeployURL:
+  pcUrl: http://dev.huoshishanxin.com/#/
+  mobUrl: http://dev.huoshishanxin.com/#/
+
+# SFTP上传配置
+sftp:
+  isEnabled: false
+  server: 101.132.166.205
+  port: 22022
+  remoteDir: /bkup/timesheet
+  user: root
+  password: Huoshi@2022
+

+ 1 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectMapper.xml

@@ -1644,7 +1644,7 @@
                 #{item}
             </foreach>
         </if>
-        order by area,workTime,id
+        order by area,id, workTime
         <if test="start!=null and size!=null">
             limit #{start},#{size}
         </if>

+ 20 - 20
fhKeeper/formulahousekeeper/timesheet/index.html

@@ -11,11 +11,11 @@
         <link rel="shortcut icon" type="image/x-icon" href="./favicon.ico"/>
         <link href="./static/css/public.css" rel="stylesheet" type="text/css"/>
         <!-- 引入样式 -->
-        <!-- <link href="https://cdn.staticfile.org/element-ui/2.13.0/theme-chalk/index.css" rel="stylesheet"> -->
-        <link rel="stylesheet" href="./static/js/element-uiCss.css">
+        <link href="https://cdn.staticfile.org/element-ui/2.13.0/theme-chalk/index.css" rel="stylesheet">
+        <!-- <link rel="stylesheet" href="./static/js/element-uiCss.css"> -->
         <!-- 接入JQ  -->
-        <!-- <script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script> -->
-        <script src="./static/js/jquery.min.js"></script>
+        <script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script>
+        <!-- <script src="./static/js/jquery.min.js"></script> -->
         <style>
             /* 滚动条样式修改 */
             /*滚动条凹槽的颜色,还可以设置边框属性 */
@@ -111,8 +111,8 @@
         if (isProductEnv) {    !(function(c,i,e,b){var h=i.createElement("script");var f=i.getElementsByTagName("script")[0];h.type="text/javascript";h.crossorigin=true;h.onload=function(){c[b]||(c[b]=new c.wpkReporter({bid:"dta_2_71020"}));c[b].installAll()};f.parentNode.insertBefore(h,f);h.src=e})(window,document,"https://g.alicdn.com/woodpeckerx/jssdk??wpkReporter.js","__wpk"); }</script> -->
     </head>
     <!-- 接入飞书 -->
-    <!-- <script type="text/javascript" src="https://lf1-cdn-tos.bytegoofy.com/goofy/lark/op/h5-js-sdk-1.5.16.js"></script> -->
-    <script src="./static/js/goofy.js"></script>
+    <script type="text/javascript" src="https://lf1-cdn-tos.bytegoofy.com/goofy/lark/op/h5-js-sdk-1.5.16.js"></script>
+    <!-- <script src="./static/js/goofy.js"></script> -->
     <!-- <script src="https://unpkg.com/vconsole/dist/vconsole.min.js"></script>
     <script>
         var vConsole = new window.VConsole();
@@ -126,24 +126,24 @@
             }
         </script>
         <!-- 引入Vue.js -->
-        <!-- <script src="https://cdn.staticfile.org/vue/2.6.10/vue.min.js"></script> -->
-        <script src="./static/js/vue.min.js"></script>
+        <script src="https://cdn.staticfile.org/vue/2.6.10/vue.min.js"></script>
+        <!-- <script src="./static/js/vue.min.js"></script> -->
         <!-- 引入vuex.js -->
-        <!-- <script src="https://cdn.staticfile.org/vuex/3.0.0/vuex.min.js"></script> -->
-        <script src="./static/js/vuex.min.js"></script>
+        <script src="https://cdn.staticfile.org/vuex/3.0.0/vuex.min.js"></script>
+        <!-- <script src="./static/js/vuex.min.js"></script> -->
         <!-- 引入vue-router -->
-        <!-- <script src="https://cdn.staticfile.org/vue-router/3.0.0/vue-router.min.js"></script> -->
-        <script src="./static/js/vue-router.min.js"></script>
+        <script src="https://cdn.staticfile.org/vue-router/3.0.0/vue-router.min.js"></script>
+        <!-- <script src="./static/js/vue-router.min.js"></script> -->
         <!-- 引入组件库 -->
-        <!-- <script src="https://cdn.staticfile.org/element-ui/2.13.0/index.js"></script> -->
-        <script src="./static/js/element-ui.js"></script>
+        <script src="https://cdn.staticfile.org/element-ui/2.13.0/index.js"></script>
+        <!-- <script src="./static/js/element-ui.js"></script> -->
         <!-- 引入echarts -->
-        <!-- <script src="https://cdn.staticfile.org/echarts/3.8.5/echarts.min.js"></script> -->
-        <script src="./static/js/echarts.min.js"></script>
+        <script src="https://cdn.staticfile.org/echarts/3.8.5/echarts.min.js"></script>
+        <!-- <script src="./static/js/echarts.min.js"></script> -->
         <!-- 引入企业微信js -->
-        <!-- <script src="https://res.wx.qq.com/open/js/jweixin-1.2.0.js" referrerpolicy="origin"></script>
-        <script src="https://open.work.weixin.qq.com/wwopen/js/jwxwork-1.0.0.js" referrerpolicy="origin"></script> -->
-        <script src="./static/js/jweixin-1.2.0.js"></script>
-        <script src="./static/js/jwxwork-1.0.0.js"></script>
+        <script src="https://res.wx.qq.com/open/js/jweixin-1.2.0.js" referrerpolicy="origin"></script>
+        <script src="https://open.work.weixin.qq.com/wwopen/js/jwxwork-1.0.0.js" referrerpolicy="origin"></script>
+        <!-- <script src="./static/js/jweixin-1.2.0.js"></script>
+        <script src="./static/js/jwxwork-1.0.0.js"></script> -->
     </body>
 </html>

+ 1 - 1
fhKeeper/formulahousekeeper/timesheet/src/views/expense/expense.vue

@@ -359,7 +359,7 @@
               <el-input v-enter-number v-model="ParticularsList.ticketNum" :disabled="flg"></el-input>
             </el-form-item>
             <el-form-item :label="$t('costtype')" style="width: 270px"> 
-                <el-select size="small" v-model="expenseMainTypeValue"  style="width: 150px">
+                <el-select size="small" v-model="expenseMainTypeValue"  style="width: 150px" :disabled="flg">
                 <el-option
                 v-for="item in expenseMainTypes"
                 :key="item.id"

+ 3 - 1
fhKeeper/formulahousekeeper/timesheet/src/views/project/list.vue

@@ -4295,7 +4295,9 @@ a {
             addUpfun() {
                 var total = 0;
                 for (var i=0;i<this.projectBaseCostData.length; i++) {
-                    total += parseFloat(this.projectBaseCostData[i].baseAmount);
+                    if (this.projectBaseCostData[i].baseAmount) {
+                        total += parseFloat(this.projectBaseCostData[i].baseAmount);
+                    }
                 }
                 this.addForm.budget = total;
                 // var a = '0'