Bläddra i källkod

Merge branch 'master' into privatedev

# Conflicts:
#	fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java
#	fhKeeper/formulahousekeeper/management-platform/src/main/resources/application-prod.yml
#	fhKeeper/formulahousekeeper/timesheet/src/views/project/fileCenter.vue
#	fhKeeper/formulahousekeeper/timesheet/src/views/team/index.vue
seyason 3 år sedan
förälder
incheckning
648146d913
23 ändrade filer med 317 tillägg och 74 borttagningar
  1. 5 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/DepartmentController.java
  2. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectBasecostController.java
  3. 2 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectController.java
  4. 1 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Department.java
  5. 5 10
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/EarningSnapshot.java
  6. 7 4
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Project.java
  7. 2 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ProjectBasecost.java
  8. 2 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/DepartmentService.java
  9. 2 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ProjectService.java
  10. 43 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DepartmentServiceImpl.java
  11. 1 6
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java
  12. 6 5
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectMapper.xml
  13. 26 3
      fhKeeper/formulahousekeeper/timesheet/src/assets/myfont/demo_index.html
  14. 7 3
      fhKeeper/formulahousekeeper/timesheet/src/assets/myfont/iconfont.css
  15. 1 1
      fhKeeper/formulahousekeeper/timesheet/src/assets/myfont/iconfont.js
  16. 7 0
      fhKeeper/formulahousekeeper/timesheet/src/assets/myfont/iconfont.json
  17. BIN
      fhKeeper/formulahousekeeper/timesheet/src/assets/myfont/iconfont.ttf
  18. BIN
      fhKeeper/formulahousekeeper/timesheet/src/assets/myfont/iconfont.woff
  19. BIN
      fhKeeper/formulahousekeeper/timesheet/src/assets/myfont/iconfont.woff2
  20. 1 1
      fhKeeper/formulahousekeeper/timesheet/src/routes.js
  21. 14 4
      fhKeeper/formulahousekeeper/timesheet/src/views/expense/expense.vue
  22. 15 21
      fhKeeper/formulahousekeeper/timesheet/src/views/project/info.vue
  23. 169 9
      fhKeeper/formulahousekeeper/timesheet/src/views/project/list.vue

+ 5 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/DepartmentController.java

@@ -33,6 +33,11 @@ public class DepartmentController {
         return departmentService.getDepartmentList(request);
     }
 
+    @RequestMapping("/listAllMemb")
+    public HttpRespMsg listAllMemb(HttpServletRequest request) {
+        return departmentService.listAllMemb(request);
+    }
+
     /**
      * 获取不带有层级的部门列表
      */

+ 1 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectBasecostController.java

@@ -53,7 +53,7 @@ public class ProjectBasecostController {
                 add.setBaseName(all.getName());
                 add.setBaseId(all.getId());
                 add.setProjectId(projectId);
-                add.setBaseAmount(0);
+                add.setBaseAmount(0.0);
                 additionalList.add(add);
             }
         });

+ 2 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectController.java

@@ -62,8 +62,8 @@ public class ProjectController {
                                    String planStartDate,
                                    String planEndDate,
                                    Integer level,
-                                   Integer contractAmount,
-                                   Integer budget,
+                                   Double contractAmount,
+                                   Double budget,
                                    Integer customerId,
                                    String projectBaseCostData
                                    ) {

+ 1 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Department.java

@@ -56,6 +56,7 @@ public class Department extends Model<Department> {
     private String managerId;
 
 
+
     @Override
     protected Serializable pkVal() {
         return this.departmentId;

+ 5 - 10
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/EarningSnapshot.java

@@ -8,11 +8,9 @@ import com.baomidou.mybatisplus.annotation.TableField;
 import java.io.Serializable;
 import java.util.List;
 
-import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
-import org.springframework.format.annotation.DateTimeFormat;
 
 /**
  * <p>
@@ -20,7 +18,7 @@ import org.springframework.format.annotation.DateTimeFormat;
  * </p>
  *
  * @author Seyason
- * @since 2021-08-02
+ * @since 2021-08-09
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -42,8 +40,6 @@ public class EarningSnapshot extends Model<EarningSnapshot> {
      * 发生时间
      */
     @TableField("indate")
-    @JsonFormat(pattern = "yyyy-MM-dd")
-    @DateTimeFormat(pattern = "yyyy-MM-dd")
     private LocalDateTime indate;
 
     /**
@@ -62,13 +58,13 @@ public class EarningSnapshot extends Model<EarningSnapshot> {
      * 项目金额
      */
     @TableField("contract_amount")
-    private Integer contractAmount;
+    private Double contractAmount;
 
     /**
      * 利润
      */
     @TableField("profit")
-    private Integer profit;
+    private Double profit;
 
     /**
      * 利润率
@@ -80,7 +76,7 @@ public class EarningSnapshot extends Model<EarningSnapshot> {
      * 总成本
      */
     @TableField("cost_total")
-    private Integer costTotal;
+    private Double costTotal;
 
     /**
      * 细分项
@@ -90,8 +86,7 @@ public class EarningSnapshot extends Model<EarningSnapshot> {
 
 
     @TableField(exist = false)
-    private List<ProjectBasecost> costList;
-
+    List<ProjectBasecost> costList;
     @Override
     protected Serializable pkVal() {
         return this.id;

+ 7 - 4
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Project.java

@@ -21,7 +21,7 @@ import org.springframework.format.annotation.DateTimeFormat;
  * </p>
  *
  * @author Seyason
- * @since 2021-08-01
+ * @since 2021-08-09
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -76,6 +76,7 @@ public class Project extends Model<Project> {
     @DateTimeFormat(pattern = "yyyy-MM-dd")
     private LocalDate planEndDate;
 
+
     /**
      * 项目进度
      */
@@ -94,6 +95,7 @@ public class Project extends Model<Project> {
     @TableField("status")
     private Integer status;
 
+
     /**
      * 实际完成日期
      */
@@ -122,17 +124,18 @@ public class Project extends Model<Project> {
     @DateTimeFormat(pattern = "yyyy-MM-dd")
     private LocalDate createDate;
 
+
     /**
      * 项目金额:单位元
      */
     @TableField("contract_amount")
-    private Integer contractAmount;
+    private Double contractAmount;
 
     /**
      * 基线总成本:单位元
      */
     @TableField("budget")
-    private Integer budget;
+    private Double budget;
 
     /**
      * 人员成本:单位元
@@ -188,12 +191,12 @@ public class Project extends Model<Project> {
     @TableField("fee_man")
     private Double feeMan;
 
-
     @TableField(exist = false)
     private String inchargerName;
 
     @TableField(exist = false)
     private List<Map<String, Object>> participationList;
+
     /**
      * 客户id
      */

+ 2 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ProjectBasecost.java

@@ -15,7 +15,7 @@ import lombok.experimental.Accessors;
  * </p>
  *
  * @author Seyason
- * @since 2021-08-02
+ * @since 2021-08-09
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -49,7 +49,7 @@ public class ProjectBasecost extends Model<ProjectBasecost> {
      * 预算金额
      */
     @TableField("base_amount")
-    private Integer baseAmount;
+    private Double baseAmount;
 
 
     @Override

+ 2 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/DepartmentService.java

@@ -30,4 +30,6 @@ public interface DepartmentService extends IService<Department> {
     HttpRespMsg getUserStatistics(String startDate, String endDate, Integer departmentId, HttpServletRequest request);
 
     HttpRespMsg exportUserStatistic(String startDate, String endDate, String userIds, HttpServletRequest request);
+
+    HttpRespMsg listAllMemb(HttpServletRequest request);
 }

+ 2 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ProjectService.java

@@ -25,9 +25,9 @@ public interface ProjectService extends IService<Project> {
                             String planStartDate,
                             String planEndDate,
                             Integer level,
-                            Integer contractAmount,
+                            Double contractAmount,
                             String projectBaseCostData,
-                            Integer budget,
+                            Double budget,
                             Integer customerId,
                             HttpServletRequest request);
 

+ 43 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DepartmentServiceImpl.java

@@ -15,12 +15,14 @@ import com.management.platform.util.ListUtil;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
+import org.springframework.web.bind.annotation.RequestMapping;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import java.math.BigDecimal;
 import java.text.DecimalFormat;
 import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -38,6 +40,8 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
     private UserMapper userMapper;
     @Resource
     private DepartmentMapper departmentMapper;
+    @Resource
+    private DepartmentService departmentService;
 
     //新增部门
     @Override
@@ -503,6 +507,45 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
         return httpRespMsg;
     }
 
+    @Override
+    public HttpRespMsg listAllMemb(HttpServletRequest request) {
+        Integer companyId = userMapper.selectById(request.getHeader("TOKEN")).getCompanyId();
+        HttpRespMsg departmentList = departmentService.getDepartmentList(request);
+        List<DepartmentVO> list = (List<DepartmentVO>) departmentList.data;
+        //加上未分配的部门
+        DepartmentVO unAssignedDept = new DepartmentVO();
+        unAssignedDept.setId(0);
+        unAssignedDept.setLabel("未分配");
+        list.add(unAssignedDept);
+
+        //获取公司全部人员
+        List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId));
+        List<HashMap> userMapList = new ArrayList<>();
+        for (User u : userList) {
+            HashMap<String, Object> user = new HashMap<String, Object>();
+            user.put("id", u.getId());
+            user.put("name", u.getName());
+            user.put("departmentId", u.getDepartmentId());
+            userMapList.add(user);
+        }
+        fillDeptUser(list, userMapList);
+
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.data = list;
+        return msg;
+    }
+
+
+    private void fillDeptUser(List<DepartmentVO> list, List<HashMap> userList) {
+        list.forEach(l->{
+            List<HashMap> collect = userList.stream().filter(u -> u.get("departmentId").equals(l.getId())).collect(Collectors.toList());
+            l.setUserList(collect);
+            if (l.getChildren() != null) {
+                fillDeptUser(l.getChildren(), userList);
+            }
+        });
+    }
+
     //获取某个部门所有子部门id
     private List<Integer> getBranchDepartment(Integer departmentId, Integer companyId) {
         List<Department> departmentList = departmentMapper.selectList(new QueryWrapper<Department>()

+ 1 - 6
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java

@@ -325,12 +325,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                         record.setCostData(projectBaseCostData);
                         record.setCostTotal(p.getBudget());
                         record.setProfit(p.getContractAmount() - p.getBudget());
-                        if (p.getContractAmount() == 0) {
-                            record.setProfitPercent(0.0);
-                        } else {
-                            record.setProfitPercent(100.0*(p.getContractAmount() - p.getBudget())/p.getContractAmount());
-                        }
-
+                        record.setProfitPercent(100.0*(p.getContractAmount() - p.getBudget())/p.getContractAmount());
                         earningSnapshotMapper.insert(record);
                     }
                 }

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

@@ -33,6 +33,11 @@
         <result column="customer_name" property="customerName" />
     </resultMap>
 
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, project_name, company_id, project_code, incharger_id, plan_start_date, plan_end_date, progress, level, status, finish_date, creator_id, creator_name, create_date, contract_amount, budget, base_man, base_outsourcing, base_risk1, base_risk2, base_fee, fee_normal, fee_travel, fee_outsourcing, fee_man, customer_id, customer_name
+    </sql>
+
     <resultMap id="CustomerResultMap" type="com.management.platform.entity.vo.CustomerProject" >
         <result column="customer_id" property="customerId" />
         <result column="customer_name" property="customerName" />
@@ -45,10 +50,6 @@
         <result column="project_ids" property="projectIds" />
         <result column="project_names" property="projectNames" />
     </resultMap>
-    <!-- 通用查询结果列 -->
-    <sql id="Base_Column_List">
-        id, project_name, company_id, project_code, incharger_id, plan_start_date, plan_end_date, progress, level, status, finish_date, creator_id, creator_name, create_date, contract_amount, budget, base_man, base_outsourcing, base_risk1, base_risk2, base_fee, fee_normal, fee_travel, fee_outsourcing, fee_man, customer_id, customer_name
-    </sql>
 
     <!--获取查询者所在公司每个项目的工时成本-->
     <select id="getParticipatedProject" resultType="java.util.Map">
@@ -170,6 +171,6 @@
         FROM project WHERE project.`company_id` = #{companyId}
         and id IN <foreach collection="ids" close=")" open="(" separator="," index="" item="item">
         #{item}
-        </foreach>
+    </foreach>
     </select>
 </mapper>

+ 26 - 3
fhKeeper/formulahousekeeper/timesheet/src/assets/myfont/demo_index.html

@@ -54,6 +54,12 @@
       <div class="content unicode" style="display: block;">
           <ul class="icon_lists dib-box">
           
+            <li class="dib">
+              <span class="icon iconfont">&#xe60f;</span>
+                <div class="name">客户管理</div>
+                <div class="code-name">&amp;#xe60f;</div>
+              </li>
+          
             <li class="dib">
               <span class="icon iconfont">&#xe634;</span>
                 <div class="name">流程</div>
@@ -372,9 +378,9 @@
 <pre><code class="language-css"
 >@font-face {
   font-family: 'iconfont';
-  src: url('iconfont.woff2?t=1627295057848') format('woff2'),
-       url('iconfont.woff?t=1627295057848') format('woff'),
-       url('iconfont.ttf?t=1627295057848') format('truetype');
+  src: url('iconfont.woff2?t=1628309598492') format('woff2'),
+       url('iconfont.woff?t=1628309598492') format('woff'),
+       url('iconfont.ttf?t=1628309598492') format('truetype');
 }
 </code></pre>
           <h3 id="-iconfont-">第二步:定义使用 iconfont 的样式</h3>
@@ -400,6 +406,15 @@
       <div class="content font-class">
         <ul class="icon_lists dib-box">
           
+          <li class="dib">
+            <span class="icon iconfont firerock-iconkehuguanli"></span>
+            <div class="name">
+              客户管理
+            </div>
+            <div class="code-name">.firerock-iconkehuguanli
+            </div>
+          </li>
+          
           <li class="dib">
             <span class="icon iconfont firerock-iconliucheng"></span>
             <div class="name">
@@ -877,6 +892,14 @@
       <div class="content symbol">
           <ul class="icon_lists dib-box">
           
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#firerock-iconkehuguanli"></use>
+                </svg>
+                <div class="name">客户管理</div>
+                <div class="code-name">#firerock-iconkehuguanli</div>
+            </li>
+          
             <li class="dib">
                 <svg class="icon svg-icon" aria-hidden="true">
                   <use xlink:href="#firerock-iconliucheng"></use>

+ 7 - 3
fhKeeper/formulahousekeeper/timesheet/src/assets/myfont/iconfont.css

@@ -1,8 +1,8 @@
 @font-face {
   font-family: "iconfont"; /* Project id 2390497 */
-  src: url('iconfont.woff2?t=1627295057848') format('woff2'),
-       url('iconfont.woff?t=1627295057848') format('woff'),
-       url('iconfont.ttf?t=1627295057848') format('truetype');
+  src: url('iconfont.woff2?t=1628309598492') format('woff2'),
+       url('iconfont.woff?t=1628309598492') format('woff'),
+       url('iconfont.ttf?t=1628309598492') format('truetype');
 }
 
 .iconfont {
@@ -13,6 +13,10 @@
   -moz-osx-font-smoothing: grayscale;
 }
 
+.firerock-iconkehuguanli:before {
+  content: "\e60f";
+}
+
 .firerock-iconliucheng:before {
   content: "\e634";
 }

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 1 - 1
fhKeeper/formulahousekeeper/timesheet/src/assets/myfont/iconfont.js


+ 7 - 0
fhKeeper/formulahousekeeper/timesheet/src/assets/myfont/iconfont.json

@@ -5,6 +5,13 @@
   "css_prefix_text": "firerock-icon",
   "description": "",
   "glyphs": [
+    {
+      "icon_id": "3686260",
+      "name": "客户管理",
+      "font_class": "kehuguanli",
+      "unicode": "e60f",
+      "unicode_decimal": 58895
+    },
     {
       "icon_id": "1868952",
       "name": "流程",

BIN
fhKeeper/formulahousekeeper/timesheet/src/assets/myfont/iconfont.ttf


BIN
fhKeeper/formulahousekeeper/timesheet/src/assets/myfont/iconfont.woff


BIN
fhKeeper/formulahousekeeper/timesheet/src/assets/myfont/iconfont.woff2


+ 1 - 1
fhKeeper/formulahousekeeper/timesheet/src/routes.js

@@ -178,7 +178,7 @@ export const allRouters = [//组织架构
         path: '/',
         component: Home,
         name: '客户管理',
-        iconCls: 'iconfont firerock-iconbaobiao',
+        iconCls: 'iconfont firerock-iconkehuguanli',
         leaf: true,
         children: [
             { path: '/customer', component: customer, name: '客户管理' }

+ 14 - 4
fhKeeper/formulahousekeeper/timesheet/src/views/expense/expense.vue

@@ -138,7 +138,7 @@
             </el-table-column>
             <el-table-column label="费用金额" width="135px">
               <template slot-scope="scope">
-                <el-input size="small"  v-model="scope.row.amount" @change="shiqu(scope.row.amount)"></el-input>
+                <el-input size="small" :id="'upam'+scope.$index" v-model="scope.row.amount" @change="shiqu(scope.row.amount)" @keyup.native="restrictNumber('upam'+scope.$index)"></el-input>
               </template>
             </el-table-column>
             <el-table-column prop="invoiceNo" label="发票号" width="135px">
@@ -318,7 +318,7 @@
             </el-table-column>
             <el-table-column prop="amount" label="费用金额(元)" width="172">
               <template slot-scope="scope">
-                <el-input size="small"  v-if="!flg" v-model="scope.row.amount" @change="kan"></el-input>
+                <el-input size="small"  v-if="!flg" :id="'am'+scope.$index" v-model="scope.row.amount" @change="kan" @keyup.native="restrictNumber('am'+scope.$index)"></el-input>
                 <span v-else>¥{{scope.row.amount}}</span>
               </template>
             </el-table-column>
@@ -456,6 +456,16 @@ export default {
       }
   },
   methods: {
+    restrictNumber(targetId) {
+        let inpu = document.getElementById(targetId);
+        inpu.value = inpu.value.replace(/[^\d.]/g, "");  //仅保留数字和"."
+        inpu.value = inpu.value.replace(/\.{2,}/g, "."); //两个连续的"."仅保留第一个"."
+        inpu.value = inpu.value.replace(".", "$#*").replace(/\./g,'').replace('$#*','.');//去除其他"."
+        inpu.value = inpu.value.replace(/^(\d+)\.(\d\d).*$/, '$1.$2');;//限制只能输入两个小数
+        if (inpu.value.indexOf(".") < 0 && inpu.value != "") { //首位是0的话去掉
+            inpu.value = parseFloat(inpu.value);
+        }
+    },
     getExpList() {
       this.http.post('/expense-type/getList', {
         },
@@ -818,12 +828,12 @@ export default {
     // 费用金额失去焦点时触发
     shiqu(){
       this.addForm.totalAmount = this.invoiceList.reduce((prev, next) => {
-        return prev + Number(next.amount);
+        return prev + parseFloat(next.amount);
       }, 0)
     },
     kan(){
       this.ParticularsList.totalAmount = this.ParticularsList.invoiceList.reduce((prev, next) => {
-        return prev + Number(next.amount)
+        return prev + parseFloat(next.amount)
       }, 0)
     }
   },

+ 15 - 21
fhKeeper/formulahousekeeper/timesheet/src/views/project/info.vue

@@ -146,8 +146,8 @@
                         <el-option v-for="item in importanceList" :key="item.id" :label="item.label" :value="item.id"></el-option>
                     </el-select>
                     <span style="margin-left:50px;margin-right:10px;">合同金额</span>
-                    <el-input v-model="addForm.contractAmount"    style="width:32%;"
-                    placeholder="整数" clearable @keyup.native="number"></el-input><span style="margin-left:10px;">元</span>
+                    <el-input v-model="addForm.contractAmount"  id="contractAmount"  style="width:32%;"
+                    placeholder="整数" clearable @keyup.native="restrictNumber('contractAmount')"></el-input><span style="margin-left:10px;">元</span>
                 </el-form-item>
                 <el-form-item label="开始日期" prop="planStartDate">
                     <el-date-picker v-model="addForm.planStartDate" 
@@ -175,25 +175,9 @@
 
         <el-dialog title="校正成本基线" v-if="addBaseFormVisible" :visible.sync="addBaseFormVisible" :close-on-click-modal="false" customClass="customWidth" width="600px">
             <el-form ref="basicInfoForm" label-width="120px">
-                <el-form-item v-for="item in modBaseCostData" :label="item.baseName" :key="item.id">
-                    <el-input v-model="item.baseAmount"  placeholder="请输入" clearable></el-input>
+                <el-form-item v-for="(item, index) in modBaseCostData" :label="item.baseName" :key="item.id">
+                    <el-input :id="'baseCost'+index" v-model="item.baseAmount"  placeholder="请输入" clearable  @keyup.native="restrictNumber('baseCost'+index)"></el-input>
                 </el-form-item>
-                <!-- <el-form-item label="人工成本" >
-                    <el-input v-model="addForm.baseMan"  placeholder="请输入" clearable></el-input>
-                </el-form-item>
-                <el-form-item label="费用" prop="baseFee">
-                    <el-input v-model="addForm.baseFee"  placeholder="请输入" clearable></el-input>
-                </el-form-item>
-                <el-form-item label="外包费用" prop="baseOutsourcing">
-                    <el-input v-model="addForm.baseOutsourcing"  placeholder="请输入" clearable></el-input>
-                </el-form-item>
-                <el-form-item label="风险预留金额1" prop="baseRisk1">
-                    <el-input v-model="addForm.baseRisk1"  placeholder="请输入" clearable></el-input>
-                </el-form-item>
-                <el-form-item label="风险预留金额2" prop="baseRisk2">
-                    <el-input v-model="addForm.baseRisk2"  placeholder="请输入" clearable></el-input>
-                </el-form-item> -->
-                
             </el-form>
             <div slot="footer" class="dialog-footer">
                 <el-button @click.native="addBaseFormVisible = false">取消</el-button>
@@ -322,6 +306,16 @@
             }
         },
         methods: {
+            restrictNumber(targetId) {
+                let inpu = document.getElementById(targetId);
+                inpu.value = inpu.value.replace(/[^\d.]/g, "");  //仅保留数字和"."
+                inpu.value = inpu.value.replace(/\.{2,}/g, "."); //两个连续的"."仅保留第一个"."
+                inpu.value = inpu.value.replace(".", "$#*").replace(/\./g,'').replace('$#*','.');//去除其他"."
+                inpu.value = inpu.value.replace(/^(\d+)\.(\d\d).*$/, '$1.$2');;//限制只能输入两个小数
+                if (inpu.value.indexOf(".") < 0 && inpu.value != "") { //首位是0的话去掉
+                    inpu.value = parseFloat(inpu.value);
+                }
+            },
             getProjectBaseData(projectId) {
                 this.http.post('/project-basecost/get',{projectId: projectId},
                         res => {
@@ -566,7 +560,7 @@
                             this.addLoading = false;
                             if (res.code == "ok") {
                                 this.$message({
-                                    message: this.addForm.id!=null?'修改':'创建'+"成功",
+                                    message: (this.addForm.id!=null?'修改':'创建')+"成功",
                                     type: "success"
                                 });
                                 this.addFormVisible = false;

+ 169 - 9
fhKeeper/formulahousekeeper/timesheet/src/views/project/list.vue

@@ -122,11 +122,12 @@
                     </el-select>
                 </el-form-item>
                 <el-form-item label="全部参与者">
-                    <el-select v-model="addForm.userId" multiple filterable placeholder="请选择参与者" style="width:100%;" @change="changeParticipator">
+                    <el-input  @focus="showChooseMembTree" v-model="addForm.userNames"></el-input>
+                    <!-- <el-select v-model="addForm.userId" multiple filterable placeholder="请选择参与者" style="width:100%;" @change="changeParticipator">
                         <el-option v-for="item in users" :key="item.id" :label="item.name" :value="item.id"></el-option>
-                    </el-select>
+                    </el-select> -->
                 </el-form-item>
-                <el-form-item label="主要负责人" >
+                <el-form-item label="负责人" >
                     <el-select v-model="addForm.inchargerId" :disabled="addForm.userId.length==0 ||  user.role==0" filterable placeholder="请选择负责人" style="width:100%;" >
                         <el-option v-for="item in participator" :key="item.id" :label="item.name" :value="item.id"></el-option>
                     </el-select>
@@ -142,8 +143,8 @@
 
                 <!-- 增加合同金额字段 -->
                         <span style="margin-left:63px;margin-right:10px;" v-if="user.company.packageProject==1">合同金额</span>
-                        <el-input v-model="addForm.contractAmount" style="width:33%;"
-                        placeholder="整数" clearable  @keyup.native="addForm.contractAmount=addForm.contractAmount.replace(/[^\d]/g,'');" ></el-input><span style="margin-left:10px;">元</span>
+                        <el-input id="contractAmount" v-model="addForm.contractAmount" style="width:33%;"
+                        placeholder="整数" clearable  @keyup.native="restrictNumber('contractAmount')" ></el-input><span style="margin-left:10px;">元</span>
                 <!-- 增加合同金额字段 -->   
 
                 </el-form-item>
@@ -171,10 +172,10 @@
                     <span class="el-dialog__title">成本基线</span>
                 </div>
             <!--新版 -->
-            <span class="rg_span" v-for="(item) in projectBaseCostData" :key="item.id">
+            <span class="rg_span" v-for="(item, index) in projectBaseCostData" :key="item.id">
                 <span style="width:120px;display: inline-block;" v-if="user.company.packageProject==1">{{item.baseName}}</span>
-                <el-input @input="addUpfun()" v-model="item.baseAmount" style="width:200px; margin-bottom: 20px"
-                placeholder="整数" clearable  @keyup.native="item.baseAmount=item.baseAmount.replace(/[^\d]/g,'');"></el-input><span style="margin-left:10px;">元</span>
+                <el-input :id="'baseCost'+index" @input="addUpfun()" v-model="item.baseAmount" style="width:200px; margin-bottom: 20px"
+                placeholder="整数" clearable  @keyup.native="restrictNumber('baseCost'+index)"></el-input><span style="margin-left:10px;">元</span>
             </span>    
 
             <!-- <span class="rg_span">
@@ -298,6 +299,24 @@
                 <el-button type="primary" @click="submitInsertBaseItem" :loading="addLoading">提交</el-button>
             </div>
         </el-dialog>
+
+        <!-- 按部门选择人员 -->
+        <el-dialog title="选择参与人员"  v-if="chooseParticipVisible" :visible.sync="chooseParticipVisible" :close-on-click-modal="false" customClass="customWidth" width="500px">
+            <!-- <el-input style="width:100%" v-model="filterName" placeholder="请输入姓名搜索" @change="findUserInTree"></el-input> -->
+            <div class="tree" style="height:400px">
+                <el-scrollbar style="height:100%">
+                <el-tree :data="deptMembData" show-checkbox :props="defaultProps" node-key="id"
+                    ref="chooseMembTree" @check-change="onTreeItemChange" :default-checked-keys="addForm.userId"
+                    highlight-current ></el-tree>
+                </el-scrollbar>
+            </div>
+            <div>已选中&nbsp;{{chosenMembCount}}&nbsp;人</div>
+            <div slot="footer" class="dialog-footer">
+                <el-button  @click="chooseParticipVisible = false" >取消</el-button>
+                <el-button type="primary" @click="chooseParticip()" >确定</el-button>
+            </div>
+        </el-dialog>
+
     </section>
 </template>
 <style scoped>
@@ -319,6 +338,27 @@
     export default {
         data() {
             return {
+                chosenMembCount:0,
+                chosenMembList:[],//选中的人员
+                allMembData:[],
+
+                deptMembData: [
+                    {
+                        id: 0,
+                        label: '未分配',
+                    }
+                ],
+                option: [],
+                depData: {
+                    id: -1,
+                    label: '全部人员',
+                },
+                defaultProps: {
+                    children: 'children',
+                    label: 'label'
+                },
+                filterName:null,
+                chooseParticipVisible: false,
                 projectBaseCostData:[],
                 addBaseItemDialog:false,
                 showBaseConfig:false,
@@ -381,6 +421,115 @@
             }
         },
         methods: {
+            restrictNumber(targetId) {
+                let inpu = document.getElementById(targetId);
+                inpu.value = inpu.value.replace(/[^\d.]/g, "");  //仅保留数字和"."
+                inpu.value = inpu.value.replace(/\.{2,}/g, "."); //两个连续的"."仅保留第一个"."
+                inpu.value = inpu.value.replace(".", "$#*").replace(/\./g,'').replace('$#*','.');//去除其他"."
+                inpu.value = inpu.value.replace(/^(\d+)\.(\d\d).*$/, '$1.$2');;//限制只能输入两个小数
+                if (inpu.value.indexOf(".") < 0 && inpu.value != "") { //首位是0的话去掉
+                    inpu.value = parseFloat(inpu.value);
+                }
+            },
+            showChooseMembTree() {
+                this.chosenMembCount = this.participator.length;
+                this.chooseParticipVisible = true;
+            },
+            onTreeItemChange() {
+                var chosenList = this.$refs.chooseMembTree.getCheckedNodes();
+                var list = chosenList.filter(item=>item.isUser == 1);
+                this.chosenMembCount = list.length;
+            },
+            findUserInTree() {
+                if (this.filterName == '') {
+                    this.deptMembData = this.allMembData;
+                } else {
+                    var list = this.findRecursively(this.filterName, this.allMembData);
+                    this.deptMembData = list;
+                }
+            },
+
+            findRecursively(username, list) {
+                var filterList = [];
+                for (var i=0;i<list.length; i++) {
+                    if (list[i].isUser == 1) {
+                        if (list[i].label.indexOf(username) >= 0) {
+                            //匹配上了
+                            filterList.push(list[i]);
+                        }
+                    } else if (list[i].children != null && list[i].children.length > 0) {
+                        var subList = this.findRecursively(username, list[i].children);
+                        if (subList.length > 0) {
+                            subList.forEach(s=>filterList.push(s));
+                        }
+                    }
+                }
+                return filterList;
+            },
+
+            //确定选择参与人
+            chooseParticip() {
+                this.chooseParticipVisible = false;
+                var chosenList = this.$refs.chooseMembTree.getCheckedNodes();
+                this.chosenMembList = chosenList.filter(item=>item.isUser == 1);
+                this.addForm.userNames = '';
+                this.addForm.userId = [];
+                this.participator = [];
+                for (var i=0;i<this.chosenMembList.length; i++) {
+                    this.addForm.userId.push(this.chosenMembList[i].id);
+                    this.addForm.userNames += this.chosenMembList[i].label+',';
+                    var item = {id:this.chosenMembList[i].id, name:this.chosenMembList[i].label};
+                    this.participator.push(item);
+                }
+                if (this.addForm.userNames.length > 0) {
+                    this.addForm.userNames = this.addForm.userNames.substring(0, this.addForm.userNames.length-1);
+                }
+            },
+            // 获取部门列表
+            getDepartment() {
+                this.http.post("/department/listAllMemb", {},
+                res => {
+                    if (res.code == "ok") {
+                        var list = res.data;
+                        //设置员工到部门下面
+                        this.setUserToDept(list);
+                        this.deptMembData = list;
+                        //用于筛选过滤
+                        this.allMembData = JSON.parse(JSON.stringify(this.deptMembData));
+                    } else {
+                        this.$message({
+                            message: res.msg,
+                            type: "error"
+                        });
+                    }
+                },
+                error => {
+                    this.$message({
+                        message: error,
+                        type: "error"
+                    });
+                });
+            },
+            
+            setUserToDept(list) {
+                for (var i in list) {
+                    if (list[i].children != null) {
+                        this.setUserToDept(list[i].children);
+                    }
+                    
+                    if (list[i].userList != null) {
+                        if (list[i].children == null) {
+                            list[i].children = [];
+                        }
+                        list[i].userList.forEach(element => {
+                            var obj = {id: element.id, label:element.name, parentId:element.departmentId, isUser:1};
+                            list[i].children.push(obj);
+                        });
+                    }
+                }
+            },
+            
+
             getProjectBaseConfigList() {
                 this.http.post('/project-basecost-setting/list',{},
                     res => {
@@ -736,6 +885,7 @@
                     this.addForm = {
                         name: '',
                         userId: [],
+                        userNames:'',
                         code:'',
                         inchargerId:null,
                         level:1,
@@ -748,13 +898,19 @@
                 } else {
                     this.title = "修改项目";
                     var list = item.participator , arr = [];
+                    var names = '';
                     for(var j in list) {
                         arr.push(list[j].id)
+                        names += list[j].name+',';
+                    }
+                    if (names.length > 0) {
+                        names = names.substring(0, names.length -1);
                     }
                     this.addForm = {
                         id: item.id,
                         name: item.projectName,
                         userId: arr,
+                        userNames:names,
                         code:item.projectCode,
                         inchargerId: item.inchargerId,
                         level: item.level,
@@ -832,7 +988,7 @@
             addUpfun() {
                 var total = 0;
                 for (var i=0;i<this.projectBaseCostData.length; i++) {
-                    total += parseInt(this.projectBaseCostData[i].baseAmount);
+                    total += parseFloat(this.projectBaseCostData[i].baseAmount);
                 }
                 this.addForm.budget = total;
                 // var a = '0'
@@ -887,6 +1043,9 @@
                         if (this.projectBaseCostData != null) {
                             formData.append("projectBaseCostData", JSON.stringify(this.projectBaseCostData));
                             //计算总预算成本
+                            if (this.addForm.budget == null) {
+                                this.addForm.budget = 0;
+                            }
                             formData.append("budget", this.addForm.budget);
                         }
                         if (this.addForm.customerId == null) {
@@ -975,6 +1134,7 @@
             };
         },
         mounted() {
+            this.getDepartment();
             this.getList();
             this.getUsers();
             this.getCustomerList();