考勤统计的列表联调+表头动态数据重组的逻辑处理+详情数据的重组问题+更新考勤的接口联调
| | |
| | | { id: 4, value: "洁净分" }, |
| | | { id: 5, value: "最大偏差" } |
| | | ] |
| | | |
| | | const attendanceStatus = [ |
| | | { id: 1, value: "正常" }, |
| | | { id: 2, value: "加班" }, |
| | | { id: 3, value: "休假" }, |
| | | { id: 4, value: "异常" }, |
| | | ] |
| | | export const getDataByType = (type) => { |
| | | if (type == "projectOptions") { |
| | | return projectOptions |
| | | }else if(type=='attendanceStatus'){ |
| | | return attendanceStatus |
| | | } |
| | | } |
New file |
| | |
| | | import request from "@/common/untils/request.js" |
| | | |
| | | // 考勤管理列表 |
| | | export function getAttendanceList(data) { |
| | | return request({ |
| | | url: "/api-jl/v1/attendance/getAttendanceList", |
| | | method: "post", |
| | | data |
| | | }) |
| | | } |
| | | // 删除考勤管理 |
| | | export function deleteAttendanceInfo(data) { |
| | | return request({ |
| | | url: "/api-jl/v1/attendance/deleteAttendanceInfo", |
| | | method: "delete", |
| | | data |
| | | }) |
| | | } |
| | | // 考勤管理 导入 |
| | | export function attendanceInput(data) { |
| | | return request({ |
| | | url: "/api-jl/v1/attendance/attendanceInput", |
| | | method: "post", |
| | | data |
| | | }) |
| | | } |
| | | // 考勤管理 获取加班规则 |
| | | export function getAttendanceRule(data) { |
| | | return request({ |
| | | url: "/api-jl/v1/attendance/getAttendanceRule", |
| | | method: "get", |
| | | data |
| | | }) |
| | | } |
| | | // 考勤管理 保存加班规则 |
| | | export function saveAttendanceRule(data) { |
| | | return request({ |
| | | url: "/api-jl/v1/attendance/saveAttendanceRule", |
| | | method: "post", |
| | | data |
| | | }) |
| | | } |
| | | //考勤统计获取 |
| | | export function getAttendanceStatistic(data) { |
| | | return request({ |
| | | url: "/api-jl/v1/attendance/getAttendanceStatistic", |
| | | method: "post", |
| | | data |
| | | }) |
| | | } |
| | | //考勤统计更新 |
| | | export function updateAttendance(data) { |
| | | return request({ |
| | | url: "/api-jl/v1/attendance/updateAttendance", |
| | | method: "post", |
| | | data |
| | | }) |
| | | } |
| | |
| | | .cursor_pointer { |
| | | cursor: pointer; |
| | | } |
| | | |
| | | .font_weight_700{ |
| | | font-weight: 700; |
| | | } |
| | | .btn-pager { |
| | | display: flex; |
| | | margin-top: 10px; |
| | |
| | | <span |
| | | v-else-if="item.isCommonClick && scope.row[item.prop]" |
| | | class="sel-name" |
| | | @click="selCommonClick(scope.row)" |
| | | @click="selCommonClick(scope.row,item.prop,item)" |
| | | > |
| | | <div v-if="item.isCallMethod"> |
| | | <span :class="item.isClass ? item.getClassName(scope.row[item.prop], scope.row) : ''"> |
| | |
| | | this.$emit("selServiceOrderClick", row) |
| | | }, |
| | | // 公共(销售机会、报价单、销售总单、销售子单。。。) |
| | | selCommonClick(row) { |
| | | this.$emit("selCommonClick", row) |
| | | selCommonClick(row,prop,item) { |
| | | this.$emit("selCommonClick", row,prop,item) |
| | | }, |
| | | // 行点击 |
| | | tableRowClick(row, column, event) { |
| | |
| | | <template slot="leftButton"> |
| | | <el-button size="small" type="primary" @click="exportClick">导入</el-button> |
| | | <el-button size="small" type="primary" @click="synchClick">同步</el-button> |
| | | <el-button size="small" type="primary" @click="ruleSettingClick">规则设置</el-button> |
| | | </template> |
| | | </CommonSearch> |
| | | </div> |
| | |
| | | <template slot="tableButton"> |
| | | <el-table-column label="操作" width="90" fixed="right"> |
| | | <template slot-scope="scope"> |
| | | <el-button @click="delClick(scope.row.id)" type="text" size="small">删除</el-button> |
| | | <el-button @click="delClick(scope.row)" type="text" size="small">删除</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </template> |
| | |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <!-- 规则设置 --> |
| | | <RuleSettingDialog ref="RuleSettingDialog" :editRow="editRow" @closeClick="getData" /> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | import { getFollowRecordList, getDeleteFollowRecord } from "@/api/productManage/silkRegisterForm.js" |
| | | import { getAttendanceList, deleteAttendanceInfo } from "@/api/employeeSalary/attendanceManage.js" |
| | | import pageMixin from "@/components/makepager/pager/mixin/pageMixin" |
| | | |
| | | import RuleSettingDialog from "@/views/employeeSalary/attendanceManage/components/RuleSettingDialog" |
| | | export default { |
| | | name: "attendanceManage", |
| | | props: { |
| | | }, |
| | | mixins: [pageMixin], |
| | | components: { |
| | | RuleSettingDialog |
| | | }, |
| | | data() { |
| | | return { |
| | |
| | | title: "新建", |
| | | infomation: {} |
| | | }, |
| | | search_map: {}, |
| | | keyword: '', |
| | | tableColumn: [ |
| | | { label: "日期", prop: "topic", min: 120, default: true }, |
| | | { label: "员工编号", prop: "client_name", min: 190,default: true}, |
| | | { label: "员工姓名", prop: "contact_name", min: 100, }, |
| | | { label: "上班打卡时间", prop: "client_status", min: 100 }, |
| | | { label: "下班打卡时间", prop: "contact_information_name", min: 100 }, |
| | | { label: "班次", prop: "follow_time", min: 100 }, |
| | | { label: "班次上班时间", prop: "next_follow_time", min: 110 }, |
| | | { label: "班次下班时间", prop: "member_name", min: 110 }, |
| | | { label: "添加时间", prop: "next_follow_time", min: 130 }, |
| | | { label: "添加人", prop: "member_name", min: 110 }, |
| | | { label: "日期", prop: "date", min: 120, default: true }, |
| | | { label: "员工编号", prop: "workerId", min: 190,default: true}, |
| | | { label: "员工姓名", prop: "workerName", min: 100, }, |
| | | { label: "上班打卡时间", prop: "startWorkTime", min: 100 }, |
| | | { label: "下班打卡时间", prop: "endWorkTime", min: 100 }, |
| | | { label: "班次", prop: "classes", min: 100 }, |
| | | { label: "班次上班时间", prop: "classesStartTime", min: 110 }, |
| | | { label: "班次下班时间", prop: "classesEndTime", min: 110 }, |
| | | { label: "添加时间", prop: "createTime", min: 130 }, |
| | | { label: "添加人", prop: "addPeople", min: 110 }, |
| | | ], |
| | | showCol: [ |
| | | "日期", |
| | | "员工编号", |
| | | "员工姓名", |
| | | "上班打卡时间", |
| | | "下班打卡时间", |
| | |
| | | "班次下班时间", |
| | | "添加时间", |
| | | "添加人", |
| | | ] |
| | | ], |
| | | editRow:{}, |
| | | } |
| | | }, |
| | | created() { |
| | | this.setTable() |
| | | this.getData(this.search_map) |
| | | this.getData(this.keyword) |
| | | }, |
| | | computed: { |
| | | }, |
| | |
| | | }, |
| | | setColumnVisible(showCol) { |
| | | return this.tableColumn.map((ele) => { |
| | | |
| | | return { |
| | | ...ele, |
| | | isShowColumn: showCol.includes(ele.label) |
| | | isShowColumn: ele.default?true:showCol.includes(ele.label) |
| | | } |
| | | }) |
| | | }, |
| | |
| | | // 请求数据 |
| | | async getData() { |
| | | this.loading = true |
| | | await getFollowRecordList({ |
| | | search_map: this.search_map, |
| | | await getAttendanceList({ |
| | | keyword: this.keyword, |
| | | page: this.pagerOptions.currPage, |
| | | pageSize: this.pagerOptions.pageSize |
| | | }) |
| | | .then((res) => { |
| | | console.log(res) |
| | | if (res.code === 200) { |
| | | if (res.data.list && res.data.list.length > 0) { |
| | | const list = res.data.list.map((item) => { |
| | | if (res.data && res.data.length > 0) { |
| | | const list = res.data.map((item) => { |
| | | return { |
| | | ...item, |
| | | client_name: item.client.name, |
| | | contact_name: item.contact.name, |
| | | client_status: item.client_status.name, |
| | | phone: item.contact.phone, |
| | | member_name: item.member.username, |
| | | contact_information_name: item.contact_information.name |
| | | } |
| | | }) |
| | | this.tableList.tableInfomation = list || [] |
| | | this.pagerOptions.totalCount = res.data.count |
| | | this.pagerOptions.totalCount = res.total |
| | | } else { |
| | | this.tableList.tableInfomation = [] |
| | | } |
| | |
| | | }, |
| | | // 搜索 |
| | | onFilterSearch(searchText) { |
| | | this.search_map.client_name = searchText ?? "" |
| | | this.keyword = searchText ?? "" |
| | | this.pagerOptions.currPage = 1 |
| | | this.getData() |
| | | }, |
| | | // 新建 |
| | | // 导入 |
| | | exportClick() { |
| | | |
| | | }, |
| | | // 打印 |
| | | // 同步 |
| | | synchClick(){ |
| | | |
| | | }, |
| | | |
| | | // 打印 |
| | | ruleSettingClick(){ |
| | | this.$refs.RuleSettingDialog.islook = true; |
| | | }, |
| | | // 删除 |
| | | delClick(id) { |
| | | delClick(row) { |
| | | this.$confirm("是否确认删除?", "警告", { |
| | | confirmButtonText: "确定", |
| | | cancelButtonText: "取消", |
| | | type: "warning" |
| | | }) |
| | | .then(() => { |
| | | getDeleteFollowRecord({ ids: [id] }).then((response) => { |
| | | deleteAttendanceInfo({ ids: [row.ID] }).then((response) => { |
| | | if (response.code === 200) { |
| | | this.$message.success("删除成功") |
| | | this.pagerOptions.currPage = 1 |
| | | this.getData() |
| | | } else { |
| | | this.$message.warning("删除失败") |
| | |
| | | <div slot="title" class="tac drawerHeader">详情</div> |
| | | <div class="dialog-content-box"> |
| | | <el-form class="form-box" ref="form" :rules="rules" :model="form" label-width="140px" label-position="right"> |
| | | <el-form-item label="员工姓名:" prop="id"> |
| | | {{ form.name }} |
| | | <el-form-item label="员工姓名:" prop="workerName"> |
| | | {{ form.workerName ||'--'}} |
| | | </el-form-item> |
| | | <el-form-item label="员工ID:" prop="isCore"> |
| | | {{ form.name }} |
| | | <el-form-item label="员工ID:" prop="workerId"> |
| | | {{ form.workerId||'--' }} |
| | | </el-form-item> |
| | | <el-form-item label="工种:" prop="id"> |
| | | {{ form.name }} |
| | | <el-form-item label="工种:" prop="workType"> |
| | | {{ form.workType||'--' }} |
| | | </el-form-item> |
| | | <el-form-item label="考勤日期:" prop="isCore"> |
| | | {{ form.name }} |
| | | <el-form-item label="考勤日期:" prop="month"> |
| | | {{ form.month||'--' }} |
| | | </el-form-item> |
| | | <el-form-item label="状态:" prop="id"> |
| | | <el-form-item label="状态:" prop="status"> |
| | | <template v-if="!isEditOne"> |
| | | <i class="el-icon-circle-check cursor_pointer font_size_20 color_67c23a"></i> |
| | | {{ form.name }} |
| | | <i v-if='form.status==1' class="el-icon-circle-check cursor_pointer font_size_20 color_67c23a"></i> |
| | | <span :class="getClassName(form.status)"> |
| | | {{ getAttendanceStatus(form.status) }} |
| | | </span> |
| | | <i @click="editOneClick" class="el-icon-edit-outline cursor_pointer font_size_20"></i> |
| | | </template> |
| | | <template v-else> |
| | | <el-select v-model="form.phoneNum" filterable placeholder="请选择" class="margin_right_15px" style="width: calc(100% - 80px)"> |
| | | <el-option v-for="item in DeviceList" :key="item.id" :label="item.name" :value="item.id"> |
| | | <el-select v-model="form.status" filterable placeholder="请选择" class="margin_right_15px" style="width: calc(100% - 120px)"> |
| | | <el-option v-for="item in attendanceStatusList" :key="item.id" :label="item.value" :value="item.id"> |
| | | </el-option> |
| | | </el-select> |
| | | <el-button type="text" @click="submitEditOneClick('form')">确定</el-button> |
| | | <el-button type="text" @click="cancelEditClick('isEditOne')">取消</el-button> |
| | | </template> |
| | | </el-form-item> |
| | | <el-form-item label="上班打卡时间:" prop="isCore"> |
| | | {{ form.name }} |
| | | <el-form-item label="上班打卡时间:" prop="startWorkTime"> |
| | | {{ form.startWorkTime||'--' }} |
| | | </el-form-item> |
| | | <el-form-item label="下班打卡时间:" prop="id"> |
| | | {{ form.name }} |
| | | <el-form-item label="下班打卡时间:" prop="endWorkTime"> |
| | | {{ form.endWorkTime||'--' }} |
| | | </el-form-item> |
| | | <el-form-item label="班次:" prop="isCore"> |
| | | {{ form.name }} |
| | | <el-form-item label="班次:" prop="classes"> |
| | | {{ form.classes ||'--'}} |
| | | </el-form-item> |
| | | <el-form-item label="班次开始时间:" prop="id"> |
| | | {{ form.name }} |
| | | <el-form-item label="班次开始时间:" prop="classesStartTime"> |
| | | {{ form.classesStartTime ||'--'}} |
| | | </el-form-item> |
| | | <el-form-item label="班次结束时间:" prop="isCore"> |
| | | {{ form.name }} |
| | | <el-form-item label="班次结束时间:" prop="classesEndTime"> |
| | | {{ form.classesEndTime||'--' }} |
| | | </el-form-item> |
| | | <el-form-item label="工作日加班时长:" prop="id"> |
| | | <el-form-item label="工作日加班时长:" prop="weekdayOverTime"> |
| | | <template v-if="!isEditTwo"> |
| | | {{ form.name }} |
| | | {{ form.weekdayOverTime }} |
| | | <i @click="editTwoClick" class="el-icon-edit-outline cursor_pointer font_size_20"></i> |
| | | </template> |
| | | <template v-else> |
| | | <el-input |
| | | v-model.number="form.produceAheadDay" |
| | | v-model.number="form.weekdayOverTime" |
| | | maxlength="20" |
| | | style="width: calc(100% - 80px)" |
| | | style="width: calc(100% - 120px)" |
| | | clearable |
| | | placeholder="请输入" |
| | | class="margin_right_15px" |
| | | ></el-input> |
| | | <el-button type="text" @click="submitEditTwoClick('form')">确定</el-button> |
| | | <el-button type="text" @click="cancelEditClick('isEditTwo')">取消</el-button> |
| | | </template> |
| | | </el-form-item> |
| | | </el-form> |
| | | </div> |
| | | <div slot="footer" class="dialog-footer tac"> |
| | | <el-button type="cancel" @click="cancelMethod()">取消</el-button> |
| | | <el-button type="primary" @click="submitForm('form')">确定</el-button> |
| | | <el-button type="cancel" @click="cancelMethod()">关闭</el-button> |
| | | <!-- <el-button type="primary" @click="submitForm('form')">确定</el-button> --> |
| | | </div> |
| | | </el-dialog> |
| | | </template> |
| | | |
| | | <script> |
| | | import { getDeleteFollowRecord } from "@/api/employeeManage/employeeInfo.js" |
| | | import { updateAttendance } from "@/api/employeeSalary/attendanceManage.js" |
| | | import { getDataByType } from "@/api/data" |
| | | export default { |
| | | props: { |
| | | editRow: { |
| | |
| | | }, |
| | | isEditOne:false, |
| | | isEditTwo:false, |
| | | DeviceList:[], |
| | | attendanceStatusList: getDataByType("attendanceStatus"), |
| | | rules: { |
| | | id: [ |
| | | { |
| | | required: true, |
| | | message: "请输入人员姓名", |
| | | trigger: ["blur", "change"], |
| | | }, |
| | | ], |
| | | name: [ |
| | | { |
| | | required: true, |
| | | message: "请输入员工编码", |
| | | trigger: ["blur", "change"], |
| | | }, |
| | | ], |
| | | produceAheadDay: [ |
| | | weekdayOverTime: [ |
| | | { |
| | | required: false, |
| | | message: "请输入", |
| | |
| | | }, |
| | | }, |
| | | methods: { |
| | | getAttendanceStatus(val){ |
| | | let string = ""; |
| | | if (val) { |
| | | for (let i in this.attendanceStatusList) { |
| | | if (this.attendanceStatusList[i].id == val) { |
| | | string = this.attendanceStatusList[i].value; |
| | | } |
| | | } |
| | | } |
| | | return string; |
| | | }, |
| | | getClassName(val){ |
| | | let classname='' |
| | | // 1==正常 2===加班 3==休假 4===异常 |
| | | if(val==1){ |
| | | classname = "color_67c23a"; |
| | | }else if(val==2){ |
| | | classname = "color_FF9900 "; |
| | | }else if(val==3){ |
| | | classname = "color_333"; |
| | | }else if(val==4){ |
| | | classname = "color_red"; |
| | | } |
| | | return classname |
| | | }, |
| | | editOneClick(){ |
| | | this.isEditOne=true |
| | | }, |
| | | submitEditOneClick(){ |
| | | this.isEditOne=false |
| | | this.submitForm('form','isEditOne') |
| | | }, |
| | | editTwoClick(){ |
| | | this.isEditTwo=true |
| | | }, |
| | | submitEditTwoClick(){ |
| | | this.isEditTwo=false |
| | | this.submitForm('form','isEditTwo') |
| | | }, |
| | | formInfo() { |
| | | if (this.islook) { |
| | | this.form = { |
| | | isCore: "", |
| | | id: "", |
| | | }; |
| | | this.form = {}; |
| | | this.$nextTick(()=>{ |
| | | this.$refs["form"].resetFields(); |
| | | if (this.editRow.id) { |
| | | if (this.editRow.workerId) { |
| | | this.form = JSON.parse(JSON.stringify(this.editRow)); |
| | | } |
| | | }) |
| | | } |
| | | }, |
| | | cancelEditClick(name){ |
| | | this[name]=false |
| | | this.formInfo() |
| | | }, |
| | | validatorNum(rule, value, callback) { |
| | | if (value) { |
| | | if (value&&this.isEditTwo) { |
| | | if (value == undefined || value == null) { |
| | | callback(new Error("请输入有效数字")); |
| | | } else { |
| | | var reg = /^\+?[0-9]\d*$/; |
| | | var reg = /^\+?[1-9]\d*$/; |
| | | if (!reg.test(value)) { |
| | | callback(new Error("请填写不小于0的数字")); |
| | | } else { |
| | |
| | | this.$refs["form"].resetFields(); |
| | | this.islook = false; |
| | | }, |
| | | submitForm(formName) { |
| | | submitForm(formName,name) { |
| | | this.$refs[formName].validate((valid) => { |
| | | if (valid) { |
| | | let form = JSON.parse(JSON.stringify(this.form)); |
| | | if (this.editRow.type == "add") { |
| | | getDeleteFollowRecord(form).then((res) => { |
| | | let day=(Number(form.dateDay)<10)?'0'+form.dateDay:form.dateDay |
| | | let params={ |
| | | date:form.month+'-'+day, |
| | | overTimeDuration:Number(form.weekdayOverTime), |
| | | status:form.status, |
| | | workerId:form.workerId |
| | | } |
| | | updateAttendance(params).then((res) => { |
| | | if (res.code == 200) { |
| | | this.$message({ |
| | | message: "添加成功!", |
| | | message: "操作成功!", |
| | | type: "success", |
| | | }); |
| | | this[name]=false |
| | | this.$emit('shutdown') |
| | | this.cancelMethod(); |
| | | } |
| | | }); |
| | | } else { |
| | | getDeleteFollowRecord(form).then((res) => { |
| | | if (res.code == 200) { |
| | | this.$message({ |
| | | message: "编辑成功!", |
| | | type: "success", |
| | | }); |
| | | this.cancelMethod(); |
| | | } |
| | | }); |
| | | } |
| | | } else { |
| | | console.log('error submit!!'); |
| | | return false; |
| | |
| | | > |
| | | <template slot="leftButton"> |
| | | <div class="margin_right_20px" style="width:200px;"> |
| | | <el-date-picker v-model="object.date" style="width:100%" type="month" placeholder="选择日期" |
| | | <el-date-picker v-model="object.date" style="width:100%" |
| | | @change="onFilterSearch" |
| | | :clearable="false" type="month" placeholder="选择日期" |
| | | :picker-options="pickerOptions" |
| | | value-format="yyyy-MM"> |
| | | </el-date-picker> |
| | | </div> |
| | | <el-button size="small" type="primary" @click="ruleSettingClick">规则设置</el-button> |
| | | </template> |
| | | </CommonSearch> |
| | | </div> |
| | |
| | | v-loading="loading" |
| | | :table-list="tableList" |
| | | @selTableCol="selTableCol" |
| | | @selCommonClick="(row,prop,item) => selCommonClick(row,prop,item)" |
| | | > |
| | | <template slot="tableButton"> |
| | | <el-table-column label="操作" width="90" fixed="right"> |
| | | <template slot-scope="scope"> |
| | | <el-button @click="delClick(scope.row.id)" type="text" size="small">删除</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </template> |
| | | </TableCommonView> |
| | | </div> |
| | | <div class="btn-pager"> |
| | | <!-- <div class="btn-pager"> |
| | | <PagerView class="page" :pager-options="pagerOptions" v-on="pagerEvents" /> |
| | | </div> |
| | | </div> --> |
| | | </div> |
| | | </div> |
| | | <AttendanceStatisticsDetails ref="attendanceStatisticsDetails" :editRow="editRow" @shutdown="getData" /> |
| | | <!-- 规则设置 --> |
| | | <RuleSettingDialog ref="RuleSettingDialog" :editRow="editRow" @closeClick="getData" /> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | import { getFollowRecordList, getDeleteFollowRecord } from "@/api/employeeSalary/attendanceStatistics.js" |
| | | import { getAttendanceStatistic } from "@/api/employeeSalary/attendanceManage.js" |
| | | import pageMixin from "@/components/makepager/pager/mixin/pageMixin" |
| | | import AttendanceStatisticsDetails from "@/views/employeeSalary/attendanceStatistics/components/AttendanceStatisticsDetails" |
| | | import RuleSettingDialog from "@/views/employeeSalary/attendanceStatistics/components/RuleSettingDialog" |
| | | import Date from "@/api/date"; |
| | | const { getCurrentMonth } = Date; |
| | | import NewDate from "@/api/date"; |
| | | const { getCurrentMonth } = NewDate; |
| | | export default { |
| | | name: "attendanceStatistics", |
| | | props: { |
| | |
| | | mixins: [pageMixin], |
| | | components: { |
| | | AttendanceStatisticsDetails, |
| | | RuleSettingDialog |
| | | }, |
| | | data() { |
| | | return { |
| | | tableList: {}, |
| | | loading: false, |
| | | pickerOptions: { |
| | | disabledDate(time) { |
| | | return time.getTime() > new Date().getTime() - 86400000; |
| | | }, |
| | | }, |
| | | object:{ |
| | | date:getCurrentMonth() |
| | | }, |
| | |
| | | title: "新建", |
| | | infomation: {} |
| | | }, |
| | | search_map: {}, |
| | | keyword: "", |
| | | tableColumn: [ |
| | | { label: "姓名", prop: "topic", min: 120, default: true }, |
| | | { label: "人员ID", prop: "client_name", min: 190,default: true}, |
| | | { label: "工种", prop: "contact_name", min: 100, }, |
| | | { label: "月份", prop: "client_status", min: 100 }, |
| | | { label: "1/周一", prop: "client_status", min: 100 }, |
| | | { label: "工作日加班时长(小时)", prop: "contact_information_name", min: 180 }, |
| | | { label: "休息日加班时长(小时)", prop: "follow_time", min: 180 }, |
| | | { label: "应出勤天数", prop: "next_follow_time", min: 110 }, |
| | | { label: "实际出勤天数", prop: "member_name", min: 110 }, |
| | | { label: "姓名", prop: "workerName", min: 120, default: true }, |
| | | { label: "人员ID", prop: "workerId", min: 190,default: true}, |
| | | { label: "工种", prop: "workType", min: 100, }, |
| | | { label: "月份", prop: "month", min: 100 }, |
| | | { label: "工作日加班时长(小时)", prop: "weekdayOverTime", min: 180 }, |
| | | { label: "休息日加班时长(小时)", prop: "restDayOverTime", min: 180 }, |
| | | { label: "应出勤天数", prop: "requiredAttendanceDays", min: 110 }, |
| | | { label: "实际出勤天数", prop: "actualAttendanceDays", min: 110 }, |
| | | ], |
| | | showCol: [ |
| | | "姓名", |
| | | "人员ID", |
| | | "工种", |
| | | "月份", |
| | | "工作日加班时长(小时)", |
| | |
| | | }, |
| | | created() { |
| | | this.setTable() |
| | | this.getData(this.search_map) |
| | | this.getData(this.keyword) |
| | | }, |
| | | computed: { |
| | | }, |
| | |
| | | setTable() { |
| | | this.tableList = { |
| | | selectIndex: true, |
| | | isFixed:true, |
| | | tableInfomation: [], |
| | | allcol: [], |
| | | showcol: this.showCol, |
| | |
| | | return this.tableColumn.map((ele) => { |
| | | return { |
| | | ...ele, |
| | | isShowColumn: showCol.includes(ele.label) |
| | | isShowColumn:ele.default?true:showCol.includes(ele.label) |
| | | } |
| | | }) |
| | | }, |
| | | selTableCol(val) { |
| | | this.showcol = val |
| | | this.tableList.tableColumn = this.setColumnVisible(val) |
| | | this.showcol = val; |
| | | this.tableList.tableColumn = this.setColumnVisible(val); |
| | | }, |
| | | // 请求数据 |
| | | async getData() { |
| | | this.loading = true |
| | | await getFollowRecordList({ |
| | | search_map: this.search_map, |
| | | page: this.pagerOptions.currPage, |
| | | pageSize: this.pagerOptions.pageSize |
| | | await getAttendanceStatistic({ |
| | | keyword: this.keyword, |
| | | month:this.object.date, |
| | | // page: this.pagerOptions.currPage, |
| | | // pageSize: this.pagerOptions.pageSize |
| | | }) |
| | | .then((res) => { |
| | | console.log(res) |
| | | if (res.code === 200) { |
| | | if (res.data.list && res.data.list.length > 0) { |
| | | let tableColumn1= [ |
| | | { label: "姓名", prop: "workerName", min: 120,default: true,fixed:'left' }, |
| | | { label: "人员ID", prop: "workerId", min: 120,default: true,fixed:'left'}, |
| | | { label: "工种", prop: "workType", min: 100,fixed:'left' }, |
| | | { label: "月份", prop: "month", min: 90 ,fixed:'left'}, |
| | | ]; |
| | | let tableColumn3=[ |
| | | { label: "工作日加班时长(小时)", prop: "weekdayOverTime", min: 140,fixed:'right'}, |
| | | { label: "休息日加班时长(小时)", prop: "restDayOverTime", min: 140,fixed:'right' }, |
| | | { label: "应出勤天数", prop: "requiredAttendanceDays", min: 110 ,fixed:'right'}, |
| | | { label: "实际出勤天数", prop: "actualAttendanceDays", min: 110,fixed:'right'}, |
| | | ] |
| | | let tableColumn2=[] |
| | | let headerList=res.data.list.length>0?res.data.list[0]:[] |
| | | if(headerList.details&&headerList.details.length>0){ |
| | | for(let i in headerList.details){ |
| | | tableColumn2.push({ |
| | | label:headerList.details[i].date+'', |
| | | prop:'headerDate'+headerList.details[i].date, |
| | | min:100, |
| | | default:true, |
| | | isCallMethod:true, |
| | | isClass: true, |
| | | getClassName:this.getHeaderClass, |
| | | getCallMethod: this.getHeaderDate, |
| | | isCommonClick:true, |
| | | isIcon:true, |
| | | }) |
| | | } |
| | | } |
| | | |
| | | let tableColumn=tableColumn1.concat(tableColumn2).concat(tableColumn3) |
| | | this.tableColumn=tableColumn; |
| | | this.setTable() |
| | | const list = res.data.list.map((item) => { |
| | | let headerItem={} |
| | | let details=item.details?item.details:[] |
| | | for(let i in details){ |
| | | headerItem['headerDate'+details[i].date]=details[i].status |
| | | } |
| | | return { |
| | | ...item, |
| | | client_name: item.client.name, |
| | | contact_name: item.contact.name, |
| | | client_status: item.client_status.name, |
| | | phone: item.contact.phone, |
| | | member_name: item.member.username, |
| | | contact_information_name: item.contact_information.name |
| | | ...headerItem, |
| | | } |
| | | }) |
| | | this.tableList.tableInfomation = list || [] |
| | | this.pagerOptions.totalCount = res.data.count |
| | | this.pagerOptions.totalCount = res.total |
| | | } else { |
| | | this.tableList.tableInfomation = [] |
| | | } |
| | |
| | | this.loading = false |
| | | }) |
| | | }, |
| | | getHeaderDate(val){ |
| | | let string='' |
| | | // 1==正常 2===加班 3==休假 4===异常 |
| | | if(val==1){ |
| | | string="<i class='el-icon-circle-check'></i>" |
| | | }else if(val==2){ |
| | | string='班' |
| | | }else if(val==3){ |
| | | string='休' |
| | | }else if(val==4){ |
| | | string='异' |
| | | } |
| | | return string |
| | | }, |
| | | getHeaderClass(val){ |
| | | let classname='' |
| | | // 1==正常 2===加班 3==休假 4===异常 |
| | | if(val==1){ |
| | | classname = "color_67c23a font_weight_700 font_size_20"; |
| | | }else if(val==2){ |
| | | classname = "color_FF9900 font_weight_700"; |
| | | }else if(val==3){ |
| | | classname = "color_333 font_weight_700"; |
| | | }else if(val==4){ |
| | | classname = "color_red font_weight_700"; |
| | | } |
| | | return classname |
| | | }, |
| | | // 搜索 |
| | | onFilterSearch(searchText) { |
| | | this.search_map.client_name = searchText ?? "" |
| | | this.keyword = searchText ?? "" |
| | | this.pagerOptions.currPage = 1 |
| | | this.getData() |
| | | }, |
| | | // 详情 |
| | | detailsClick(row) { |
| | | let config=JSON.parse(JSON.stringify(row)); |
| | | this.editRow = { ...config, title:'编辑',type:'add' } |
| | | this.$refs.addWorkKind.islook = true; |
| | | }, |
| | | // 打印 |
| | | ruleSettingClick(){ |
| | | this.$refs.RuleSettingDialog.islook = true; |
| | | }, |
| | | selCommonClick(row,prop,item){ |
| | | |
| | | // 删除 |
| | | delClick(id) { |
| | | this.$confirm("是否确认删除?", "警告", { |
| | | confirmButtonText: "确定", |
| | | cancelButtonText: "取消", |
| | | type: "warning" |
| | | }) |
| | | .then(() => { |
| | | getDeleteFollowRecord({ ids: [id] }).then((response) => { |
| | | if (response.code === 200) { |
| | | this.$message.success("删除成功") |
| | | this.getData() |
| | | } else { |
| | | this.$message.warning("删除失败") |
| | | let config=JSON.parse(JSON.stringify(row)); |
| | | let details=config.details |
| | | let headerItem={} |
| | | for(let i in details){ |
| | | if(details[i].date==item.label){ |
| | | headerItem.classes=details[i].classes |
| | | headerItem.classesEndTime=details[i].classesEndTime |
| | | headerItem.classesStartTime=details[i].classesStartTime |
| | | headerItem.endWorkTime=details[i].endWorkTime |
| | | headerItem.startWorkTime=details[i].startWorkTime |
| | | headerItem.status=details[i].status |
| | | headerItem.dateDay=details[i].date |
| | | break; |
| | | } |
| | | }) |
| | | }) |
| | | .catch(() => {}) |
| | | } |
| | | this.editRow = { |
| | | ...config, |
| | | ...headerItem, |
| | | } |
| | | this.$refs.attendanceStatisticsDetails.islook = true; |
| | | }, |
| | | } |
| | | } |
| | |
| | | overflow: hidden; |
| | | } |
| | | .list-view { |
| | | height: calc(100% - 60px); |
| | | height: calc(100% - 10px); |
| | | overflow: hidden; |
| | | } |
| | | .btn-pager { |