resultSet.vue 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. <template>
  2. <div class="box-all boxMinHeight">
  3. <PageHead :phName="packageName"></PageHead>
  4. <div class="main">
  5. <div class="flex-box-ce" style="padding: 10px 0;border-bottom: 1px solid #f1f1f1;margin-bottom: 20px;">
  6. <span :class="{ active: activeName=='noEntering' }" style="width: 80px;" @click="activeName='noEntering'">未录入({{ noStatusListTotal }})</span>
  7. <span :class="{ active: activeName=='entering' }" style="width: 80px;" @click="activeName='entering'">已录入({{ statusListTotal }})</span>
  8. </div>
  9. <div v-show="activeName=='noEntering'">
  10. <div v-for="(item,index) in noStatusList" :key="index">
  11. <div class="wd-title">{{item.wdName}}</div>
  12. <el-table :data="item.list" border :header-cell-style="{ background: '#ECF5FF' }">
  13. <el-table-column prop="userName" label="姓名"></el-table-column>
  14. <!-- <el-table-column prop="wdName" label="维度"></el-table-column> -->
  15. <el-table-column prop="name" label="指标名称"></el-table-column>
  16. <el-table-column prop="per_remark" label="考核标准" min-width="200">
  17. <template slot-scope="scope">
  18. <PreBox :value="scope.row.per_remark"></PreBox>
  19. </template>
  20. </el-table-column>
  21. <el-table-column prop="target" label="目标值"></el-table-column>
  22. <el-table-column prop="weight" label="权重%"></el-table-column>
  23. <el-table-column prop="remark" label="备注" min-width="200"></el-table-column>
  24. <el-table-column label="实际完成结果值" min-width="150">
  25. <template slot-scope="scope">
  26. <div class="flex-box-ce">
  27. <el-input type="textarea" style="min-width: 130px;" :rows="1" v-model="scope.row.result" placeholder="请输入"></el-input>
  28. <span style="width: 40px;padding-left: 5px;" class="font-flex-word">{{scope.row.unit}}</span>
  29. </div>
  30. </template>
  31. </el-table-column>
  32. </el-table>
  33. </div>
  34. </div>
  35. <div v-show="activeName=='entering'">
  36. <div v-for="(item,index) in statusList" :key="index">
  37. <div class="wd-title">{{item.wdName}}</div>
  38. <el-table :data="item.list" border :header-cell-style="{ background: '#ECF5FF' }">
  39. <el-table-column prop="userName" label="姓名"></el-table-column>
  40. <!-- <el-table-column prop="wdName" label="维度"></el-table-column> -->
  41. <el-table-column prop="name" label="指标名称"></el-table-column>
  42. <el-table-column prop="per_remark" label="考核标准" min-width="200">
  43. <template slot-scope="scope">
  44. <PreBox :value="scope.row.per_remark"></PreBox>
  45. </template>
  46. </el-table-column>
  47. <el-table-column prop="target" label="目标值"></el-table-column>
  48. <el-table-column prop="weight" label="权重%"></el-table-column>
  49. <el-table-column prop="remark" label="备注" min-width="200"></el-table-column>
  50. <el-table-column label="实际完成结果值" min-width="150" prop="result">
  51. <template slot-scope="scope">
  52. <span>
  53. <span class="font-flex-word">{{scope.row.result}}</span>
  54. <span style="width: 40px;padding-left: 5px;" class="font-flex-word">{{scope.row.unit}}</span>
  55. </span>
  56. </template>
  57. </el-table-column>
  58. </el-table>
  59. </div>
  60. </div>
  61. </div>
  62. <footer class="footer flex-box-end" v-if="activeName == 'noEntering'">
  63. <el-button class="primaryBtn" @click="save(1)">暂存</el-button>
  64. <el-button type="primary" @click="save(0)">提交结果值</el-button>
  65. </footer>
  66. </div>
  67. </template>
  68. <script>
  69. import PageHead from '@/components/public/PageHead'; //头部---返回
  70. export default {
  71. components: { PageHead },
  72. name: 'resultSet',
  73. data() {
  74. return {
  75. title: '2024年的绩效考核',
  76. activeName: 'noEntering',
  77. noStatusList: [],
  78. noStatusListTotal:0,
  79. statusList: [],
  80. statusListTotal:0,
  81. id:'',//员工考核记录id
  82. packageName:'',//考核包名称 结果值录入用到
  83. };
  84. },
  85. watch: {},
  86. created() {
  87. if (this.$route.query.id) {
  88. this.id = this.$route.query.id;
  89. this.packageName=this.$route.query.packageName;
  90. this.getPackageDtail();
  91. }
  92. },
  93. mounted() {},
  94. methods: {
  95. // 提交
  96. save(num) {
  97. let isLr = false;
  98. let data = {
  99. id: this.id, //个人考核包ID
  100. cache: num, //是否暂存 1 是 0 否(提交)
  101. result_info: '' //结果值信息
  102. };
  103. let result_info = [];
  104. this.noStatusList.some(item => {
  105. item.list.forEach(e=>{
  106. if (e.result) {
  107. result_info.push({
  108. result: e.result, //单项目结果值
  109. dimension_key: e.message.dimension_key, //维度索引
  110. index_key: e.message.index_key, //指标索引
  111. index_id: e.id //指标ID
  112. });
  113. isLr = true;
  114. }
  115. })
  116. });
  117. if(!isLr){
  118. this.$message.error("至少输入一项结果值")
  119. return false;
  120. }
  121. data.result_info=JSON.stringify(result_info);
  122. this.$axios('post', '/api/per/package/record_result',data).then(res => {
  123. this.$message.success(num==1? '暂存成功':'提交成功');
  124. this.getPackageDtail();
  125. })
  126. },
  127. getPackageDtail() {
  128. this.$axios('get', '/api/per/package/employee/info', {id: this.id}).then(res => {
  129. let data = res.data.data;
  130. let dimension = data.dimension;
  131. let relevance_employee=data.relevance_employee
  132. dimension.forEach((item, index) => {
  133. if (item.index.length > 0) {
  134. item.index.forEach((item2, index2) => {
  135. item2.wdName = item.name;
  136. item2.userName = relevance_employee.name;
  137. });
  138. }
  139. });
  140. let flow = data.flow;
  141. let list = []; //结果值录入集合
  142. flow.some(item => {
  143. if (item.code == 'result_value') {
  144. item.target.forEach(item2 => {
  145. if (item2.employee_id == this.$getUserData().id) {
  146. list = item2.list;
  147. status = item2.status;
  148. }
  149. });
  150. return true
  151. }
  152. });
  153. let statusList = []; //已录入指标
  154. let noStatusList = []; //未录入指标
  155. list.forEach(item => {//区分录入与未录入
  156. if (item.status == 2) {
  157. dimension[item.dimension_key].index[item.index_key].message = item;
  158. statusList.push(dimension[item.dimension_key].index[item.index_key]);
  159. }
  160. if (item.status == 1) {
  161. dimension[item.dimension_key].index[item.index_key].message = item;
  162. if(item.result_cache){//是否有暂存的数据有就显示出来
  163. dimension[item.dimension_key].index[item.index_key].result=item.result_cache
  164. }
  165. noStatusList.push(dimension[item.dimension_key].index[item.index_key]);
  166. }
  167. });
  168. this.statusListTotal=statusList.length;
  169. this.noStatusListTotal=noStatusList.length;
  170. this.statusList = this.conformityData(statusList);
  171. this.noStatusList = this.conformityData(noStatusList);
  172. });
  173. },
  174. conformityData(arr){
  175. let returnArr=[];
  176. let strs= new Set(arr.map(item=>{
  177. return item.wdName
  178. }))
  179. strs.forEach(item=>{
  180. let obj={
  181. wdName:item,
  182. list:arr.filter(e=>{
  183. return e.wdName==item
  184. })
  185. }
  186. returnArr.push(obj)
  187. })
  188. return returnArr;
  189. },
  190. }
  191. };
  192. </script>
  193. <style scoped lang="scss">
  194. .wd-title{
  195. margin: 20px 0;
  196. padding-left: 10px;
  197. border-left: 3px solid #409eff;
  198. }
  199. .box-all {
  200. position: relative;
  201. background-color: #fff;
  202. font-size: 14px;
  203. padding: 20px;
  204. }
  205. .main {
  206. margin-bottom: 60px;
  207. }
  208. .footer {
  209. position: fixed;
  210. bottom: 0;
  211. left: 0;
  212. right: 0;
  213. background-color: #fff;
  214. border-top: 1px solid #e8e8e8;
  215. padding: 12px 30px;
  216. }
  217. .active{
  218. color: #409EFF;
  219. }
  220. </style>