Forráskód Böngészése

Merge branch 'master' of http://47.92.161.104:10080/shuzhan/shinestar-portal

yanliming 4 éve
szülő
commit
22eef7a38d

+ 2 - 4
.env.development

@@ -1,9 +1,7 @@
 OUT_PUT_DIR=dist/shinestar-portal
 
-#VUE_APP_BACKEND_URL=http://wisdomhouse.sudaonline.net
-#VUE_APP_BACKEND_URL=http://ykt-test.xiaoxinda.com/shinestar-server
-VUE_APP_BACKEND_URL=http://127.0.0.1:8086/shinestar-server
-#VUE_APP_BACKEND_URL=http://xpgjapi.xiaoxinda.com
+#VUE_APP_BACKEND_URL=http://127.0.0.1:8086/shinestar-server
+VUE_APP_BACKEND_URL=http://223.75.170.44:6060/shinestar-server
 
 VUE_APP_LOCAL_IP=127.0.0.1
 VUE_APP_LOCAL_BACKEND_URL=http://127.0.0.1:8086/shinestar-server

+ 6 - 1
src/api/business/workScheduleAttendance.js

@@ -50,6 +50,11 @@ function exportXls(formData) {
   return request.post(constant.serverUrl + "/business/workScheduleAttendance/exportXls", formData);
 }
 
+function dayStatPageList(formData) {
+  return request.post(constant.serverUrl + "/business/workScheduleAttendance/dayStat/pageList", formData);
+}
+
+
 export default {
-  pageList, create, edit, add, update, remove, batchRemove, personWorkList,exportXls
+  pageList, create, edit, add, update, remove, batchRemove, personWorkList,exportXls,dayStatPageList
 }

+ 14 - 1
src/routers/modules/business.js

@@ -52,7 +52,20 @@ var routers = [
                 }
         },
         {
-                //考勤统计
+                //考勤日报表
+                path: '/business/workScheduleAttendance/dayStat',
+                name: 'BusinessWorkScheduleAttendanceDayStat',
+                // route level code-splitting
+                // this generates a separate chunk (about.[hash].js) for this route
+                // which is lazy-loaded when the route is visited.
+                component: () => import('@/views/business/workScheduleAttendance-day-stat.vue'),
+                meta: {
+                        roles: ["admin"],
+                        title: '考勤日报表'
+                }
+        },
+        {
+                //携物出厂
                 path: '/business/carryThingsOutFactory/list',
                 name: 'BusinessCarryThingsOutFactoryList',
                 // route level code-splitting

+ 1 - 1
src/views/base/companyInfo-list.vue

@@ -292,7 +292,7 @@
       <el-form label-width="150px">
         <el-form-item label="模板下载">
           <el-link
-            href="http://rccs.oss-cn-hangzhou.aliyuncs.com/smart/companyInfo/2020/4/13111357680.xls"
+            href="http://rccs.oss-cn-hangzhou.aliyuncs.com/shinestar/%E5%8D%95%E4%BD%8D%E5%AF%BC%E5%85%A5%E6%A8%A1%E6%9D%BF.xls"
             type="primary"
             target="_blank"
             >点击下载模板</el-link

+ 10 - 0
src/views/base/personInfo-detail.vue

@@ -88,6 +88,16 @@
             </el-form-item>
           </el-col>
         </el-row>
+        <el-row>
+          <el-col :span="24">
+            <el-form-item label="车牌号" prop="carNum">
+              <el-input
+                v-model="formModel.carNum"
+                placeholder="请输入车牌号"
+              ></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
         <el-row>
           <el-col :span="24">
             <el-form-item label="关联单位" prop="personCompany">

+ 1 - 1
src/views/base/personInfo-list.vue

@@ -664,7 +664,7 @@
       <el-form label-width="150px">
         <el-form-item label="模板下载">
           <el-link
-            href="http://rccs.oss-cn-hangzhou.aliyuncs.com/smart/personInfo/2020/10/小鹏管家人员导入模板.xls"
+            href="http://rccs.oss-cn-hangzhou.aliyuncs.com/shinestar/%E4%BA%BA%E5%91%98%E5%AF%BC%E5%85%A5%E6%A8%A1%E6%9D%BF.xls"
             type="primary"
             target="_blank"
             >点击下载模板</el-link

+ 2 - 2
src/views/base/workPersonScheduling-change.vue

@@ -86,10 +86,10 @@
                 @click="selectShift(shift)"
                 v-if="selectId == shift.id"
                 class="active"
-                >{{ shift.number }} - {{ shift.name }}  {{shift.workStartTime}} - {{shift.workEndTime}}</a
+                >{{ shift.number }} - {{ shift.name }}  {{shift.workTime}} - {{shift.closingTime}}</a
               >
               <a href="#" @click="selectShift(shift)" v-else
-                >{{ shift.number }} - {{ shift.name }}  {{shift.workStartTime}} - {{shift.workEndTime}}</a
+                >{{ shift.number }} - {{ shift.name }}  {{shift.workTime}} - {{shift.closingTime}}</a
               >
             </li>
           </ul>

+ 366 - 0
src/views/business/workScheduleAttendance-day-stat.vue

@@ -0,0 +1,366 @@
+<template>
+  <div>
+    <el-breadcrumb separator=">">
+      <el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item>
+      <el-breadcrumb-item>
+        <a href="#">考勤管理</a>
+      </el-breadcrumb-item>
+      <el-breadcrumb-item>
+        <a href="#">考勤日报表</a>
+      </el-breadcrumb-item>
+    </el-breadcrumb>
+    <el-divider></el-divider>
+    <!--
+      要resetFields起作用,必须配置:model和prop
+    -->
+    <el-form
+      ref="queryForm"
+      :model="queryModel"
+      :rules="ruleValidate"
+      inline
+      class="demo-form-inline"
+    >
+      <div>
+        <el-row>
+          <el-form-item label="统计日期" prop="date">
+            <el-date-picker
+              v-model="queryModel.date"
+              type="date"
+              value-format="yyyy-MM-dd"
+              size="mini"
+            ></el-date-picker>
+          </el-form-item>
+          <el-form-item label="单位/部门" prop="companyId">
+            <el-select-tree
+              :props="props"
+              :options="companyResult"
+              v-model="queryModel.companyId"
+              height="200"
+            ></el-select-tree>
+            &nbsp;
+            <el-checkbox v-model="queryModel.subordinate"
+              >是否包含下级单位</el-checkbox
+            >
+          </el-form-item>
+          <el-form-item label="姓名" prop="name">
+            <el-input
+              type="text"
+              size="mini"
+              v-model="queryModel.name"
+              style="width: 100px"
+            ></el-input>
+          </el-form-item>
+          <el-form-item>
+            <el-button
+              type="primary"
+              size="mini"
+              style="margin-left: 8px"
+              @click="handleQuery('queryForm')"
+              >查询</el-button
+            >&nbsp;
+            <el-button
+              type="info"
+              size="mini"
+              style="margin-left: 8px"
+              @click="handleReset('queryForm')"
+              >重置</el-button
+            >
+          </el-form-item>
+        </el-row>
+      </div>
+    </el-form>
+    <el-divider></el-divider>
+    <!--
+    <el-row class="button-group">
+      <el-button
+        type="primary"
+        size="small"
+        plain
+        icon="el-icon-download"
+        :loading="xlsLoading"
+        @click="downloadAll"
+        >导出数据</el-button
+      >
+    </el-row>
+    -->
+    <el-table
+      ref="formTable"
+      stripe
+      :data="tableData"
+      :height="tableHeight"
+      style="width: 100%"
+      v-loading="loading"
+      :element-loading-text="loadingText"
+    >
+      <el-table-column
+        type="index"
+        label="序号"
+        :index="indexMethod"
+         fixed="left"
+        width="50"
+      ></el-table-column>
+      <el-table-column
+        prop="personId"
+        label="编号"
+        width="100"
+        fixed="left"
+      ></el-table-column>
+      <el-table-column
+        prop="jobNumber"
+        label="工号"
+        width="120"
+        fixed="left"
+      ></el-table-column>
+      <el-table-column
+        prop="personName"
+        label="姓名"
+        width="120"
+        fixed="left"
+      ></el-table-column>
+      <el-table-column
+        label="考勤"
+      >
+        <template slot-scope="{row}">
+          <span v-if="row.workAttendanceList==null">未设置排班</span>
+          <div class="flex-row">
+            <div v-for="(item,index) in row.workAttendanceList" :key="index" style="margin-right:2px;">
+              <table width="320">
+                <tr>
+                  <td colspan="4">{{item.number}}.{{item.name}}</td>
+                </tr>
+                <tr>
+                  <td>上班时间:</td>
+                  <td>{{item.workTime}}</td>
+                  <td>打卡时间:</td>
+                  <td>{{item.workBeginAttendance!=null ? item.workBeginAttendance.recordTime : ""}}</td>
+                </tr>
+                <tr>
+                  <td>下班时间:</td>
+                  <td>{{item.closingTime}}</td>
+                  <td>打卡时间:</td>
+                  <td>{{item.workEndAttendance!=null ? item.workEndAttendance.recordTime : ""}}</td>
+                </tr>
+              </table>
+              
+            </div>
+          </div>
+        </template>
+      </el-table-column>
+    </el-table>
+    <el-pagination
+      :current-page.sync="pageIndex"
+      :total="totalElements"
+      :page-sizes="pageSizeList"
+      @current-change="changePage"
+      @size-change="pageSizeChange"
+      layout="total, sizes, prev, pager, next, jumper"
+    ></el-pagination>
+    <workScheduleAttendance-detail
+      v-if="showModal"
+      :businessKey="businessKey"
+      :title="modalTitle"
+      @close="onDetailModalClose"
+    ></workScheduleAttendance-detail>
+  </div>
+</template>
+<script>
+import Constant from "@/constant";
+import workScheduleAttendanceApi from "@/api/business/workScheduleAttendance";
+import companyInfoApi from "@/api/base/companyInfo";
+import SelectTree from "@/components/SelectTree";
+import NProgress from "nprogress"; // progress bar
+import "nprogress/nprogress.css"; // progress bar style
+
+export default {
+  name: "BusinessWorkScheduleAttendanceDayStat",
+  data() {
+    var self = this;
+
+    return {
+      ruleValidate: {
+        companyId: [{ required: true, message: "不能为空", trigger: "blur" }],
+        date: [
+          { required: true, message: "请选择考勤日期", trigger: "blur" },
+        ],
+      },
+      queryModel: {
+        companyId: "",
+        date: "",
+        subordinate: false,
+        name: ""
+      },
+      loading: false,
+      xlsLoading: false,
+      tableData: [],
+      pageIndex: 1,
+      pageSize: 10,
+      totalPages: 0,
+      totalElements: 0,
+      field: "",
+      direction: "",
+      pageSizeList: [10, 20, 30],
+      multipleSelection: [],
+      showModal: false,
+      modalTitle: "",
+      businessKey: "",
+      treeData: [],
+      props: {
+        // 配置项(必选)
+        value: "id",
+        label: "name",
+        children: "children",
+      },
+      companyResult: [],
+      tableHeight: 400,
+      timeRangesDefaultTime: [],
+      loadingText: "加载中",
+    };
+  },
+  created() {
+    var self = this;
+    companyInfoApi.treeList().then(function (response) {
+      var jsonData = response.data;
+      if (jsonData.result) {
+        if (jsonData.data != null && jsonData.data != "") {
+          self.companyResult = jsonData.data;
+        }
+      }
+    });
+  },
+  methods: {
+    indexMethod(index) {
+      return (this.pageIndex - 1) * this.pageSize + (index + 1);
+    },
+    changePage(pageIndex) {
+      var self = this;
+      self.pageIndex = pageIndex;
+
+      var formData = new FormData();
+
+      formData.append("pageIndex", self.pageIndex);
+      formData.append("pageSize", self.pageSize);
+      formData.append("companyId", self.queryModel.companyId);
+      formData.append("subordinate", self.queryModel.subordinate);
+      formData.append("name", self.queryModel.name);
+      formData.append("date", self.queryModel.date);
+
+      self.loading = true;
+      self.loadingText = "加载中";
+
+      workScheduleAttendanceApi.dayStatPageList(formData).then((response)=>{
+        var jsonData = response.data;
+
+        self.loading = false;
+
+        //if (jsonData.result) {
+          self.tableData = jsonData.data.data;
+
+          self.totalPages = jsonData.data.totalPages;
+          self.totalElements = jsonData.data.recordsTotal;
+
+          //45为分页栏的高度
+          //页面高度-列表上面的高度-分页栏高度
+          self.tableHeight =
+            window.innerHeight - self.$refs.formTable.$el.offsetTop - 100;
+        // } else {
+        //   self.$message({
+        //     type: "warning",
+        //     message: jsonData.message,
+        //   });
+        // }
+      });
+    },
+    downloadAll() {
+      //导出
+      var self = this;
+      var formData = new FormData();
+      if (self.queryModel.companyId == null) {
+        self.queryModel.companyId = "";
+      }
+
+      formData.append("companyId", self.queryModel.companyId);
+      formData.append("subordinate", self.queryModel.subordinate);
+      formData.append("name", self.queryModel.name);
+      formData.append("date", self.queryModel.date);
+
+      self.loading = true;
+      self.loadingText = "加载中";
+
+      // workScheduleAttendanceApi.exportXls(formData).then(function (response) {
+      //   self.loading = false;
+      //   var jsonData = response.data;
+      //   if (jsonData.result) {
+      //     if (jsonData.data != null) {
+      //       if(document.location.href.startsWith("https://")){
+      //           jsonData.data = jsonData.data.replace("http://","https://");
+      //       }
+            
+      //       self.$message({
+      //         showClose: true,
+      //         type: "success",
+      //         dangerouslyUseHTMLString: true,
+      //         message: `报表已生成,<a href="${jsonData.data}" target="_blank">点击下载报表</a>&nbsp;`,
+      //         duration: 30000,
+      //       });
+      //     }
+      //   }
+      // });
+    },
+    pageSizeChange(pageSize) {
+      this.pageSize = pageSize;
+
+      this.$nextTick(() => {
+        this.changePage(this.pageIndex);
+      });
+    },
+    sortChange(data) {
+      this.field = data.column.field;
+      this.direction = data.order;
+
+      this.changePage(this.pageIndex);
+    },
+    handleReset(name) {
+      this.$refs[name].resetFields();
+    },
+    handleQuery() {
+      var self = this;
+      this.$refs["queryForm"].validate((valid) => {
+        if (valid) {
+          self.changePage(1);
+        }
+      });
+    }
+  },
+  mounted: function () {
+    //this.changePage(1);
+  },
+  components: {
+    "el-select-tree": SelectTree,
+  },
+};
+</script>
+<style lang="scss" scoped>
+.el-breadcrumb {
+  margin: 10px;
+  line-height: 20px;
+}
+
+.el-divider {
+  margin: 5px 0;
+}
+
+.demo-form-inline {
+  margin-left: 10px;
+  text-align: left;
+}
+
+.button-group {
+  margin-left: 10px;
+  text-align: left;
+}
+
+.flex-row{
+  display: flex;
+  flex-direction: row;
+}
+</style>