ソースを参照

提交车间工时系统文件

Lijy 1 年間 前
コミット
b2ca34e405

+ 22 - 14
fhKeeper/formulahousekeeper/timesheet-workshop-h5/babel.config.js

@@ -1,16 +1,24 @@
 module.exports = {
-    plugins: [
-        [
-            "import",
-            {
-                libraryName: "vant",
-                libraryDirectory: "es",
-                // 指定样式路径
-                // style: name => `${name}/style/less`
-                style: true
-            },
-            "vant"
-        ],
-        ["@babel/plugin-syntax-dynamic-import"]
-    ]
+  presets: [["@babel/preset-env", { modules: false }]],
+  plugins: [
+    [
+      "import",
+      {
+        libraryName: "vant",
+        libraryDirectory: "es",
+        // 指定样式路径
+        // style: name => `${name}/style/less`
+        style: true,
+      },
+      "vant",
+    ],
+    ["@babel/plugin-syntax-dynamic-import"],
+    [
+      "component",
+      {
+        libraryName: "element-ui",
+        styleLibraryName: "theme-chalk",
+      },
+    ],
+  ],
 };

+ 90 - 2
fhKeeper/formulahousekeeper/timesheet-workshop-h5/package-lock.json

@@ -2507,6 +2507,14 @@
       "integrity": "sha1-3TeelPDbgxCwgpH51kwyCXZmF/0=",
       "dev": true
     },
+    "async-validator": {
+      "version": "1.8.5",
+      "resolved": "https://registry.npmmirror.com/async-validator/-/async-validator-1.8.5.tgz",
+      "integrity": "sha512-tXBM+1m056MAX0E8TL2iCjg8WvSyXu0Zc8LNtYqrVeyoL3+esHRZ4SieE9fKQyyU09uONjnMEjrNBMqT0mbvmA==",
+      "requires": {
+        "babel-runtime": "6.x"
+      }
+    },
     "asynckit": {
       "version": "0.4.0",
       "resolved": "https://registry.npm.taobao.org/asynckit/download/asynckit-0.4.0.tgz",
@@ -2653,6 +2661,11 @@
         "resolve": "^1.12.0"
       }
     },
+    "babel-helper-vue-jsx-merge-props": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmmirror.com/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-2.0.3.tgz",
+      "integrity": "sha512-gsLiKK7Qrb7zYJNgiXKpXblxbV5ffSwR0f5whkPAaBAR4fhi6bwRZxX9wBlIc5M/v8CCkXUbXZL4N/nSE97cqg=="
+    },
     "babel-loader": {
       "version": "8.2.2",
       "resolved": "https://registry.npm.taobao.org/babel-loader/download/babel-loader-8.2.2.tgz?cache=0&sync_timestamp=1606424647115&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbabel-loader%2Fdownload%2Fbabel-loader-8.2.2.tgz",
@@ -2693,6 +2706,38 @@
         }
       }
     },
+    "babel-plugin-component": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmmirror.com/babel-plugin-component/-/babel-plugin-component-1.1.1.tgz",
+      "integrity": "sha512-WUw887kJf2GH80Ng/ZMctKZ511iamHNqPhd9uKo14yzisvV7Wt1EckIrb8oq/uCz3B3PpAW7Xfl7AkTLDYT6ag==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-module-imports": "7.0.0-beta.35"
+      },
+      "dependencies": {
+        "@babel/helper-module-imports": {
+          "version": "7.0.0-beta.35",
+          "resolved": "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0-beta.35.tgz",
+          "integrity": "sha512-vaC1KyIZSuyWb3Lj277fX0pxivyHwuDU4xZsofqgYAbkDxNieMg2vuhzP5AgMweMY7fCQUMTi+BgPqTLjkxXFg==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "7.0.0-beta.35",
+            "lodash": "^4.2.0"
+          }
+        },
+        "@babel/types": {
+          "version": "7.0.0-beta.35",
+          "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.0.0-beta.35.tgz",
+          "integrity": "sha512-y9XT11CozHDgjWcTdxmhSj13rJVXpa5ZXwjjOiTedjaM0ba5ItqdS02t31EhPl7HtOWxsZkYCCUNrSfrOisA6w==",
+          "dev": true,
+          "requires": {
+            "esutils": "^2.0.2",
+            "lodash": "^4.2.0",
+            "to-fast-properties": "^2.0.0"
+          }
+        }
+      }
+    },
     "babel-plugin-dynamic-import-node": {
       "version": "2.3.3",
       "resolved": "https://registry.npm.taobao.org/babel-plugin-dynamic-import-node/download/babel-plugin-dynamic-import-node-2.3.3.tgz",
@@ -2762,6 +2807,22 @@
         "@babel/helper-define-polyfill-provider": "^0.2.0"
       }
     },
+    "babel-runtime": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmmirror.com/babel-runtime/-/babel-runtime-6.26.0.tgz",
+      "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==",
+      "requires": {
+        "core-js": "^2.4.0",
+        "regenerator-runtime": "^0.11.0"
+      },
+      "dependencies": {
+        "regenerator-runtime": {
+          "version": "0.11.1",
+          "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+          "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
+        }
+      }
+    },
     "balanced-match": {
       "version": "1.0.0",
       "resolved": "https://registry.npm.taobao.org/balanced-match/download/balanced-match-1.0.0.tgz",
@@ -4477,8 +4538,7 @@
     "deepmerge": {
       "version": "1.5.2",
       "resolved": "https://registry.npm.taobao.org/deepmerge/download/deepmerge-1.5.2.tgz?cache=0&sync_timestamp=1612354180346&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdeepmerge%2Fdownload%2Fdeepmerge-1.5.2.tgz",
-      "integrity": "sha1-EEmdhohEza1P7ghC34x/bwyVp1M=",
-      "dev": true
+      "integrity": "sha1-EEmdhohEza1P7ghC34x/bwyVp1M="
     },
     "default-gateway": {
       "version": "5.0.5",
@@ -4927,6 +4987,19 @@
       "integrity": "sha1-hX4xDKAPC3XaTh22/w4HPMSpHd8=",
       "dev": true
     },
+    "element-ui": {
+      "version": "2.15.13",
+      "resolved": "https://registry.npmmirror.com/element-ui/-/element-ui-2.15.13.tgz",
+      "integrity": "sha512-LJoatEYX6WV74FqXBss8Xfho9fh9rjDSzrDrTyREdGb1h1R3uRvmLh5jqp2JU137aj4/BgqA3K06RQpQBX33Bg==",
+      "requires": {
+        "async-validator": "~1.8.1",
+        "babel-helper-vue-jsx-merge-props": "^2.0.0",
+        "deepmerge": "^1.2.0",
+        "normalize-wheel": "^1.0.1",
+        "resize-observer-polyfill": "^1.5.0",
+        "throttle-debounce": "^1.0.1"
+      }
+    },
     "elliptic": {
       "version": "6.5.4",
       "resolved": "https://registry.nlark.com/elliptic/download/elliptic-6.5.4.tgz",
@@ -8247,6 +8320,11 @@
       "integrity": "sha1-suHE3E98bVd0PfczpPWXjRhlBVk=",
       "dev": true
     },
+    "normalize-wheel": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/normalize-wheel/-/normalize-wheel-1.0.1.tgz",
+      "integrity": "sha512-1OnlAPZ3zgrk8B91HyRj+eVv+kS5u+Z0SCsak6Xil/kmgEia50ga7zfkumayonZrImffAxPU/5WcyGhzetHNPA=="
+    },
     "npm-run-path": {
       "version": "2.0.2",
       "resolved": "https://registry.npm.taobao.org/npm-run-path/download/npm-run-path-2.0.2.tgz",
@@ -10218,6 +10296,11 @@
       "integrity": "sha1-79qpjqdFEyTQkrKyFjpqHXqaIUc=",
       "dev": true
     },
+    "resize-observer-polyfill": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmmirror.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz",
+      "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg=="
+    },
     "resolve": {
       "version": "1.20.0",
       "resolved": "https://registry.npm.taobao.org/resolve/download/resolve-1.20.0.tgz",
@@ -11508,6 +11591,11 @@
         "neo-async": "^2.6.0"
       }
     },
+    "throttle-debounce": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmmirror.com/throttle-debounce/-/throttle-debounce-1.1.0.tgz",
+      "integrity": "sha512-XH8UiPCQcWNuk2LYePibW/4qL97+ZQ1AN3FNXwZRBNPPowo/NRU5fAlDCSNBJIYCKbioZfuYtMhG4quqoJhVzg=="
+    },
     "through": {
       "version": "2.3.8",
       "resolved": "https://registry.npm.taobao.org/through/download/through-2.3.8.tgz",

+ 2 - 0
fhKeeper/formulahousekeeper/timesheet-workshop-h5/package.json

@@ -17,6 +17,7 @@
     "css-loader": "^3.6.0",
     "dingtalk-jsapi": "^2.13.42",
     "echarts": "^4.9.0",
+    "element-ui": "^2.15.13",
     "font-awesome": "^4.7.0",
     "jquery": "^3.6.1",
     "pdfh5": "^1.4.2",
@@ -33,6 +34,7 @@
     "autoprefixer": "^9.8.6",
     "axios": "^0.26.1",
     "babel-eslint": "^10.1.0",
+    "babel-plugin-component": "^1.1.1",
     "eslint": "^5.16.0",
     "eslint-plugin-vue": "^5.2.3",
     "less": "^3.13.1",

+ 3 - 0
fhKeeper/formulahousekeeper/timesheet-workshop-h5/public/index.html

@@ -70,6 +70,9 @@
         .popupSearch .van-search__content {
             background-color: #FFFFFF !important;
         }
+        .chooseSomeoneo_group .van-radio__label, .chooseSomeoneo_group .van-checkbox__label {
+          flex: 1 !important;
+        }
     </style>
 </head>
 

+ 31 - 1
fhKeeper/formulahousekeeper/timesheet-workshop-h5/src/App.vue

@@ -1,5 +1,5 @@
 <template>
-    <div>
+    <div class="h100">
         <keep-alive>
             <router-view v-if="$route.meta.keepAlive"></router-view>
         </keep-alive>
@@ -42,6 +42,36 @@ export default {
 </script>
 
 <style>
+  * {
+    font-family: '微软雅黑';
+  }
+  .h100 {
+    height: 100vh;
+    box-sizing: border-box;
+  }
+  /* flex */
+  .flexCoum {
+    display: flex;
+    flex-wrap: wrap;
+    flex-direction: column;
+    height: 100%;
+  }
+  /* 超出隐藏 */
+  .textBeyondHiding {
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+  }
+
+  .flexCoum-box {
+    flex: 1;
+    overflow: auto;
+  }
+  /* 去除滚动条 */
+  .contentRoll::-webkit-scrollbar { width: 0 !important }
+  .contentRoll { -ms-overflow-style: none; }
+  .contentRoll { overflow: -moz-scrollbars-none; }
+
   .popupDiv {
     background: #F4F4F4;
     position: relative;

+ 75 - 0
fhKeeper/formulahousekeeper/timesheet-workshop-h5/src/assets/collapse.js

@@ -0,0 +1,75 @@
+
+const elTransition =
+  "0.3s height ease-in-out, 0.3s padding-top ease-in-out, 0.3s padding-bottom ease-in-out";
+const Transition = {
+  "before-enter"(el) {
+    el.style.transition = elTransition;
+    if (!el.dataset) el.dataset = {};
+ 
+    el.dataset.oldPaddingTop = el.style.paddingTop;
+    el.dataset.oldPaddingBottom = el.style.paddingBottom;
+ 
+    el.style.height = 0;
+    el.style.paddingTop = 0;
+    el.style.paddingBottom = 0;
+  },
+ 
+  enter(el) {
+    el.dataset.oldOverflow = el.style.overflow;
+    if (el.scrollHeight !== 0) {
+      el.style.height = el.scrollHeight + "px";
+      el.style.paddingTop = el.dataset.oldPaddingTop;
+      el.style.paddingBottom = el.dataset.oldPaddingBottom;
+    } else {
+      el.style.height = "";
+      el.style.paddingTop = el.dataset.oldPaddingTop;
+      el.style.paddingBottom = el.dataset.oldPaddingBottom;
+    }
+ 
+    el.style.overflow = "hidden";
+  },
+ 
+  "after-enter"(el) {
+    el.style.transition = "";
+    el.style.height = "";
+    el.style.overflow = el.dataset.oldOverflow;
+  },
+ 
+  "before-leave"(el) {
+    if (!el.dataset) el.dataset = {};
+    el.dataset.oldPaddingTop = el.style.paddingTop;
+    el.dataset.oldPaddingBottom = el.style.paddingBottom;
+    el.dataset.oldOverflow = el.style.overflow;
+ 
+    el.style.height = el.scrollHeight + "px";
+    el.style.overflow = "hidden";
+  },
+ 
+  leave(el) {
+    if (el.scrollHeight !== 0) {
+      el.style.transition = elTransition;
+      el.style.height = 0;
+      el.style.paddingTop = 0;
+      el.style.paddingBottom = 0;
+    }
+  },
+ 
+  "after-leave"(el) {
+    el.style.transition = "";
+    el.style.height = "";
+    el.style.overflow = el.dataset.oldOverflow;
+    el.style.paddingTop = el.dataset.oldPaddingTop;
+    el.style.paddingBottom = el.dataset.oldPaddingBottom;
+  }
+};
+ 
+export default {
+  name: "collapseTransition",
+  functional: true,
+  render(h, { children }) {
+    const data = {
+      on: Transition
+    };
+    return h("transition", data, children);
+  }
+};

+ 6 - 0
fhKeeper/formulahousekeeper/timesheet-workshop-h5/src/components/Element.js

@@ -0,0 +1,6 @@
+import Vue from 'vue'
+import { Tree, Radio, Checkbox } from 'element-ui'
+import 'element-ui/lib/theme-chalk/index.css';
+Vue.use(Tree)
+Vue.use(Radio)
+Vue.use(Checkbox)

+ 225 - 0
fhKeeper/formulahousekeeper/timesheet-workshop-h5/src/components/chooseSomeone.vue

@@ -0,0 +1,225 @@
+<template>
+  <div class="chooseSomeone">
+    <div class="chooseSomeone_selsect">
+      <van-search v-model="selectValue" shape="round" background="#F4F4F4" placeholder="请输入姓名"
+        @search="onSearch"></van-search>
+    </div>
+    <div class="chooseSomeone_Con contentRoll">
+      <!-- 单选 -->
+      <van-radio-group v-model="radioVal" class="chooseSomeone_radio_group" v-if="groupView == 1">
+        <van-radio :name="item.id" v-for="item, index in personnelList" :key="index">
+          <div class="chooseSomeone_radio_group_item">
+            <div>{{ item.name }}</div>
+            <div class="textBeyondHiding">{{ item.workStation }}</div>
+          </div>
+        </van-radio>
+      </van-radio-group>
+
+      <!-- 复选 -->
+      <van-checkbox-group v-model="groupVal" class="chooseSomeoneo_group" v-if="groupView == 2">
+        <van-checkbox :name="item.id" v-for="item, index in personnelList" :key="index">
+          <div class="chooseSomeone_group_item">
+            <div>{{ item.name }}</div>
+            <div class="textBeyondHiding">{{ item.workStation }}</div>
+          </div>
+        </van-checkbox>
+      </van-checkbox-group>
+
+      <!-- tree -->
+      <div class="treeBox" v-if="groupView == 3">
+        <div class="treeBox_tree_text"><van-icon name="arrow-left" />返回</div>
+        <div class="treeBox_tree">
+          <el-tree v-model="treeVal" show-checkbox node-key="id" :data="personnelTree" :props="defaultProps"></el-tree>
+        </div>
+      </div>
+    </div>
+    <div class="chooseSomeone_btn">
+      <van-button round size="small">从其他工位选择员工</van-button>
+      <van-button round type="info" size="small">确定</van-button>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  props: {
+    groupView: {
+      type: Number,
+      default: () => 3 // 1单选 2复选 3tree
+    }
+  },
+  components: {},
+  data() {
+    return {
+      selectValue: '',
+      radioVal: '',
+      groupVal: [],
+      treeVal: [],
+      // 人员数组
+      personnelList: [
+        { id: 1, name: '张山', workNumber: '123', workStation: '工位1' },
+        { id: 2, name: '李四', workNumber: '123', workStation: '工位2' },
+        { id: 3, name: '王五', workNumber: '123', workStation: '工位3' },
+        { id: 4, name: '赵六', workNumber: '123', workStation: '工位4' },
+        { id: 5, name: '张山', workNumber: '123', workStation: '工位5' },
+        { id: 6, name: '李四', workNumber: '123', workStation: '工位6' },
+        { id: 7, name: '王五', workNumber: '123', workStation: '工位7' },
+        { id: 8, name: '赵六', workNumber: '123', workStation: '工位8' },
+        { id: 9, name: '张山', workNumber: '123', workStation: '工位9' },
+        { id: 10, name: '李四', workNumber: '123', workStation: '工位10' },
+        { id: 11, name: '王五', workNumber: '123', workStation: '工位11' },
+        { id: 12, name: '赵六', workNumber: '123', workStation: '工位12' },
+        { id: 13, name: '张山', workNumber: '123', workStation: '工位13' },
+        { id: 14, name: '李四', workNumber: '123', workStation: '工位14' },
+      ],
+      personnelTree: [{
+        label: '一级 1',
+        children: [{
+          label: '二级 1-1',
+          children: [{
+            label: '三级 1-1-1'
+          }]
+        }]
+      }, {
+        label: '一级 2',
+        children: [{
+          label: '二级 2-1',
+          children: [{
+            label: '三级 2-1-1'
+          }]
+        }, {
+          label: '二级 2-2',
+          children: [{
+            label: '三级 2-2-1'
+          }]
+        }]
+      }, {
+        label: '一级 3',
+        children: [{
+          label: '二级 3-1',
+          children: [{
+            label: '三级 3-1-1'
+          }]
+        }, {
+          label: '二级 3-2',
+          children: [{
+            label: '三级 3-2-1'
+          }]
+        }]
+      }],
+      defaultProps: {
+        children: 'children',
+        label: 'label'
+      }
+    };
+  },
+  computed: {},
+  watch: {},
+  created() { },
+  mounted() { },
+  methods: {
+    onSearch() {
+      console.log('搜索', this.selectValue)
+    }
+  },
+};
+</script>
+
+<style scoped lang="less">
+* {
+  box-sizing: border-box;
+}
+
+.chooseSomeone {
+  display: flex;
+  flex-wrap: wrap;
+  flex-direction: column;
+  width: 100%;
+  height: 100%;
+  padding: 10px 15px 0px 15px;
+
+  .chooseSomeone_selsect {
+    .van-search__content {
+      background-color: #fff;
+    }
+  }
+
+  .treeBox {
+    width: 100%;
+    height: 100%;
+    display: flex;
+    flex-direction: column;
+
+    .treeBox_tree {
+      flex: 1;
+      overflow-y: auto;
+      padding: 10px;
+    }
+    .treeBox_tree_text{
+      font-size: 14px;
+      color: #999;
+      display: flex;
+      align-items: center;
+      padding: 8px;
+      .van-icon {
+        margin-right: 6px;
+      }
+    }
+
+    // 调整组件的默认样式
+    .el-tree-node__content {
+      height: 30px;
+    }
+  }
+  .chooseSomeone_Con {
+    flex: 1;
+    background-color: #fff;
+    border-radius: 10px;
+    overflow-y: auto;
+    padding: 10px;
+
+    .chooseSomeoneo_group {
+
+      .van-radio,
+      .van-checkbox {
+        width: 100%;
+        padding: 10px;
+        font-size: 16px;
+        color: #333;
+        border-bottom: 1px solid #F4F4F4;
+
+        .van-radio__label {
+          flex: 1 !important;
+        }
+
+        .van-checkbox__label {
+          flex: 1 !important;
+        }
+      }
+
+      .chooseSomeone_group_item {
+        display: flex;
+        justify-content: space-between;
+
+        div:last-child {
+          font-size: 12px;
+          color: #999;
+          width: 50%;
+          text-align: right;
+        }
+      }
+    }
+  }
+
+  .chooseSomeone_btn {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    height: 50px;
+
+    .van-button {
+      width: 48%;
+    }
+  }
+}
+</style>

+ 3 - 2
fhKeeper/formulahousekeeper/timesheet-workshop-h5/src/main.js

@@ -12,20 +12,21 @@ import axios from 'axios'; /* 引入axios进行地址访问*/
 Vue.prototype.$http = axios;
 
 import "@/components/Vant";
+import './components/Element.js'
 
 import { Form , Toast , Grid, GridItem , DatetimePicker , Popover,
 Picker , Dialog , NumberKeyboard , Sticky , Skeleton ,
 Panel , Divider , List , pullRefresh , SwipeCell, Checkbox, 
 Search, Slider,Stepper,Tag, Calendar, Row, Col, RadioGroup, Radio, 
 Loading ,DropdownMenu, DropdownItem, Button, ActionSheet, PullRefresh,Tabbar,
-TabbarItem,Uploader,Collapse, CollapseItem,Empty} from 'vant';
+TabbarItem,Uploader,Collapse, CollapseItem,Empty, CheckboxGroup, } from 'vant';
 
 Vue.use(Form).use(Toast).use(Grid).use(GridItem).use(DatetimePicker)
 .use(Picker).use(Dialog).use(NumberKeyboard).use(Sticky).use(Skeleton)
 .use(Panel).use(Divider).use(List).use(pullRefresh).use(SwipeCell)
 .use(Checkbox).use(Search).use(Slider).use(Stepper).use(Tag).use(Calendar).use(RadioGroup).use(Radio)
 .use(Row).use(Col).use(Loading).use(DropdownMenu).use(DropdownItem).use(Button).use(ActionSheet)
-.use(PullRefresh).use(Tabbar).use(TabbarItem).use(Popover).use(Uploader).use(Collapse).use(CollapseItem).use(Empty);
+.use(PullRefresh).use(Tabbar).use(TabbarItem).use(Popover).use(Uploader).use(Collapse).use(CollapseItem).use(Empty).use(CheckboxGroup);
 
 // rem
 import "amfe-flexible";

+ 9 - 0
fhKeeper/formulahousekeeper/timesheet-workshop-h5/src/router/index.js

@@ -40,6 +40,15 @@ const router = new Router({
             keepAlive: false
         }
     },
+    {
+        path: "/distribution",
+        name: "distribution",
+        component: () => import("@/views/planView/todayPlan/distribution"),
+        meta: {
+            title: "计划详情",
+            keepAlive: false
+        }
+    },
     {
         path: "/tomorrowPlan",
         component: () => import("@/views/planView/tomorrowPlan/tomorrowPlan"),

+ 195 - 10
fhKeeper/formulahousekeeper/timesheet-workshop-h5/src/views/planView/component/planComponent.vue

@@ -1,26 +1,211 @@
 <template>
-  <div>
-    公共组件
+  <div class="planComponent">
+    <div class="planComponent_con contentRoll">
+      <div class="planComponent_box" v-for="item, index in productList" :key="index">
+        <div class="planComponent_Item">
+          <div class="planComponent_ItemTop">
+            <div>产品1</div>
+            <div>001</div>
+            <div>
+              <p>20220616-2020618</p><span @click="workShowHide(index)">{{ item.flg ? paiArr[0] : paiArr[1] }}</span>
+            </div>
+          </div>
+          <collapse>
+            <div v-if="item.flg">
+              <div :class="`planComponent_ItemBom planComponent_show`">
+                <div class="PlanItem">
+                  <div>项目代码:</div><span>年后年后年后年后年后年后年后年后年后年后年后年后年后年后年后年后年后</span>
+                </div>
+                <div class="PlanItem">
+                  <div>计划总工价:</div><span class="textBeyondHiding">321</span>
+                </div>
+                <div class="PlanItem">
+                  <div>数量:</div><span class="textBeyondHiding">123</span>
+                </div>
+                <div class="PlanItem">
+                  <div>单位:</div><span class="textBeyondHiding">321</span>
+                </div>
+                <div class="PlanItem">
+                  <div>订单数量:</div><span class="textBeyondHiding">123</span>
+                </div>
+                <div class="PlanItem">
+                  <div>编组:</div><span class="textBeyondHiding">321</span>
+                </div>
+                <div class="PlanItem">
+                  <div>每列数量:</div><span class="textBeyondHiding">123</span>
+                </div>
+                <div class="PlanItem">
+                  <div>每辆数量:</div><span class="textBeyondHiding">321</span>
+                </div>
+                <div class="PlanItemBtn">
+                  <van-button type="info" size="small" @click="toDistribution(item)">派工单</van-button>
+                </div>
+              </div>
+            </div>
+          </collapse>
+        </div>
+      </div>
+    </div>
   </div>
 </template>
 
 <script>
+import collapse from '../../../assets/collapse.js'
 export default {
-  props: {},
-  components: {},
+  props: {
+    titleText: {
+      type: String,
+      default: '今日计划'
+    }
+  },
+  components: {
+    collapse
+  },
   data() {
     return {
-
+      activeNames: ['1'],
+      productList: [{ flg: false }, { flg: false }, { flg: false }, { flg: false }, { flg: false }, { flg: false }, { flg: false }, { flg: false }, { flg: false }, { flg: false }, { flg: false }],
+      paiArr: ['收起', '派工']
     };
   },
   computed: {},
   watch: {},
-  created() {},
-  mounted() {},
-  methods: {},
+  created() { },
+  mounted() { 
+    console.log(this.titleText)
+    if(this.titleText == '今日计划') {
+      this.paiArr = ['收起', '派工']
+    } else {
+      this.paiArr = ['收起', '展开']
+    }
+   },
+  methods: {
+    workShowHide(index) {
+      this.productList[index].flg = !this.productList[index].flg;
+    },
+    toDistribution(item) {
+      this.$router.push({
+        path: '/distribution',
+        query: {
+          // id: item.id
+          titleText: this.titleText
+        }
+      })
+    }
+  },
 };
 </script>
 
-<style scoped>
+<style scoped lang="less">
+* {
+  box-sizing: border-box;
+}
+
+.planComponent {
+  width: 100%;
+  height: 100%;
+  padding: 15px;
+  display: flex;
+  flex-direction: column;
+  flex-wrap: wrap;
+
+  .planComponent_header {}
+
+  .planComponent_con {
+    flex: 1;
+    overflow: auto;
+  }
+
+  .planComponent_box {
+    width: 100%;
+    background-color: #fff;
+    border-radius: 4px;
+    padding: 10px;
+    margin-bottom: 15px;
+    overflow: hidden;
+    position: relative;
+
+    .planComponent_Item {
+      .planComponent_ItemTop {
+        div {
+          width: 100%;
+          display: flex;
+          align-items: center;
+          justify-content: space-between;
+          font-size: 16px;
+          color: #333;
+          margin-bottom: 8px;
+          overflow: hidden;
+          text-overflow: ellipsis;
+          white-space: nowrap;
+
+          span {
+            color: #1989fa;
+          }
+
+          p {
+            max-width: 280px;
+            overflow: hidden;
+            text-overflow: ellipsis;
+            white-space: nowrap;
+          }
+
+          &:last-child {
+            margin-bottom: 0;
+          }
+        }
+      }
+
+      .planComponent_hide {
+        overflow: hidden;
+      }
+
+      .planComponent_show {
+        height: auto !important;
+        margin-top: 10px;
+        padding: 0px 6px 6px 6px;
+        border-top: 1px solid #E6E6E6;
+      }
+
+      .planComponent_ItemBom {
+        height: 0;
+        font-size: 16px;
+        display: flex;
+        flex-wrap: wrap;
+
+        .PlanItem {
+          width: 50%;
+          display: flex;
+          padding-top: 8px;
+
+          &:first-child {
+            width: 100%;
+
+            span {
+              width: 230px;
+              word-break: break-all;
+            }
+          }
+
+          div {
+            width: 100px;
+            text-align: right;
+            color: #666;
+          }
+
+          span {
+            display: inline-block;
+            color: #333;
+          }
+        }
 
-</style>
+        .PlanItemBtn {
+          width: 100%;
+          display: flex;
+          justify-content: flex-end;
+          margin: 12px 0 0 0;
+        }
+      }
+    }
+  }
+}</style>

+ 180 - 0
fhKeeper/formulahousekeeper/timesheet-workshop-h5/src/views/planView/todayPlan/distribution.vue

@@ -0,0 +1,180 @@
+<template>
+  <div class="distribution">
+    <van-nav-bar :title="titleText" left-text="返回" :right-text="!todayAndTomorrow ? '下发计划' : ''" @click-left="back" @click-right="placeAnOrder" fixed left-arrow/>
+    <div class="distribution_header">
+      <div>东湾2号线电池箱</div>
+      <div>00001</div>
+      <div>20230620</div>
+    </div>
+    <div class="distribution_con contentRoll">
+      <div class="distribution_box" v-for="item,index in distributionList" :key="index">
+        <div class="distribution_ItemBom">
+          <div class="PlanItem">
+            <span>东湾2号线电池箱东湾2号线电池箱</span>
+          </div>
+          <div class="PlanItem" v-show="todayAndTomorrow">
+            <div>组员:</div>
+            <span class="textBeyondHiding" v-if="item.personnel" @click="distributionProp(item,index)">{{ item.personnel }} <van-icon name="edit" color="#1989fa" /> </span>
+            <span style="color: #1989fa;" v-if="!item.personnel" @click="distributionProp(item,index)">分配</span>
+          </div>
+          <div class="PlanItem">
+            <div>单件工价:</div><span class="textBeyondHiding">123</span>
+          </div>
+          <div class="PlanItem">
+            <div>总工价:</div><span class="textBeyondHiding">123</span>
+          </div>
+          <div class="PlanItem">
+            <div>单件工时:</div><span class="textBeyondHiding">123</span>
+          </div>
+          <div class="PlanItem">
+            <div>总工时:</div><span class="textBeyondHiding">123</span>
+          </div>
+          <div class="PlanItem" v-if="todayAndTomorrow">
+            <div>进度:</div><span class="textBeyondHiding">123</span>
+          </div>
+          <div class="PlanItem">
+            <div>质检类型:</div><span class="textBeyondHiding">123</span>
+          </div>
+        </div>
+      </div>
+    </div>
+    <!-- 弹出层选人 -->
+    <van-popup v-model="popupShow" round position="bottom" :style="{ height: '80%',background: '#F4F4F4' }" >
+      <ChooseSomeone></ChooseSomeone>
+    </van-popup>
+  </div>
+</template>
+
+<script>
+import ChooseSomeone from '../../../components/chooseSomeone.vue'
+export default {
+  props: {},
+  components: {
+    ChooseSomeone
+  },
+  data() {
+    return {
+      distributionList: [
+        {personnel: ''},
+        {personnel: '张三'},
+        {personnel: ''},
+        {personnel: '李四'},
+        {personnel: '王五'},
+        {personnel: ''},
+        {personnel: ''},
+        {personnel: ''},
+        {personnel: ''},
+        {personnel: ''},
+      ],
+      distributionIndex: null,
+      popupShow: false,
+      titleText: '今日计划', // 默认文字
+      todayAndTomorrow: true, // true 今日计划,false 明日计划
+    };
+  },
+  computed: {},
+  watch: {},
+  created() {},
+  mounted() {
+    this.titleText = this.$route.query.titleText
+    if(this.titleText == '今日计划') {
+      this.todayAndTomorrow = true
+    } else {
+      this.todayAndTomorrow = false
+    }
+  },
+  methods: {
+    back() {
+      this.$router.go(-1);
+    },
+    // 下单计划
+    placeAnOrder() {
+      console.log('点击了下单计划')
+    },
+    distributionProp(item, index) {
+      this.distributionIndex = index
+      this.popupShow = true
+    }
+  },
+};
+</script>
+
+<style scoped lang="less">
+  * {
+    box-sizing: border-box;
+  }
+  .distribution {
+    width: 100%;
+    height: 100%;
+    padding: 54px 15px 15px 15px;
+    display: flex;
+    flex-direction: column;
+    flex-wrap: wrap;
+    background-color: #F4F4F4;
+    color: #333;
+
+    .distribution_header {
+      font-size: 16px;
+      div {
+        margin-top: 6px;
+      }
+    }
+
+    .distribution_con {
+      flex: 1;
+      overflow: auto;
+      margin-top: 14px;
+
+      .distribution_box {
+        width: 100%;
+        background-color: #fff;
+        border-radius: 4px;
+        padding: 10px;
+        margin-bottom: 15px;
+        position: relative;
+        overflow: hidden;
+
+        .distribution_ItemBom {
+          font-size: 16px;
+          display: flex;
+          flex-wrap: wrap;
+          padding: 0px 6px 6px 6px;
+
+          .PlanItem {
+            width: 50%;
+            display: flex;
+            padding-top: 12px;
+
+            &:first-child {
+              width: 100%;
+              padding-top: 10px;
+              span {
+                font-size: 18px;
+                color: #333;
+              }
+            }
+
+            &:nth-child(2) {
+              width: 100%;
+              span {
+                width: 230px;
+                word-break: break-all;
+              }
+            }
+
+            div {
+              width: 80px;
+              text-align: right;
+              color: #666;
+            }
+
+            span {
+              display: inline-block;
+              color: #333;
+            }
+          }
+        }
+      }
+    }
+  }
+</style>

+ 22 - 5
fhKeeper/formulahousekeeper/timesheet-workshop-h5/src/views/planView/todayPlan/todayPlan.vue

@@ -1,13 +1,19 @@
 <template>
-  <div>
-    今日计划
+  <div class="flexCoum">
+    <van-nav-bar title="今日计划" left-text="返回" @click-left="back" fixed left-arrow/>
+    <div class="todayPlan flexCoum-box">
+      <PlanComponent :titleText="'今日计划'"></PlanComponent>
+    </div>
   </div>
 </template>
 
 <script>
+import PlanComponent from '../component/planComponent.vue'
 export default {
   props: {},
-  components: {},
+  components: {
+    PlanComponent
+  },
   data() {
     return {
 
@@ -17,10 +23,21 @@ export default {
   watch: {},
   created() {},
   mounted() {},
-  methods: {},
+  methods: {
+    back() {
+      this.$router.go(-1);
+    },
+  },
 };
 </script>
 
 <style scoped>
-
+  * {
+    box-sizing: border-box;
+  }
+  .todayPlan {
+    height: 100%;
+    background-color: #F4F4F4;
+    padding-top: 46px;
+  }
 </style>

+ 22 - 5
fhKeeper/formulahousekeeper/timesheet-workshop-h5/src/views/planView/tomorrowPlan/tomorrowPlan.vue

@@ -1,13 +1,19 @@
 <template>
-  <div>
-    明日计划
+  <div class="flexCoum">
+    <van-nav-bar title="明日计划" left-text="返回" @click-left="back" fixed left-arrow/>
+    <div class="todayPlan flexCoum-box">
+      <PlanComponent :titleText="'明日计划'"></PlanComponent>
+    </div>
   </div>
 </template>
 
 <script>
+import PlanComponent from '../component/planComponent.vue'
 export default {
   props: {},
-  components: {},
+  components: {
+    PlanComponent
+  },
   data() {
     return {
 
@@ -17,10 +23,21 @@ export default {
   watch: {},
   created() {},
   mounted() {},
-  methods: {},
+  methods: {
+    back() {
+      this.$router.go(-1);
+    },
+  },
 };
 </script>
 
 <style scoped>
-
+  * {
+    box-sizing: border-box;
+  }
+  .todayPlan {
+    height: 100%;
+    background-color: #F4F4F4;
+    padding-top: 46px;
+  }
 </style>