wanshenmean
2024-09-11 28f1259ec675a191d2a852f74566400e6cc40b50
前端问题改动,与代码优化
已修改13个文件
已重命名1个文件
已添加3个文件
1046 ■■■■ 文件已修改
Code Management/WMS/WIDESEA_WMSClient/src/components/basic/VolTable.vue 481 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code Management/WMS/WIDESEA_WMSClient/src/extension/widesea_wms/basicinfo/Dt_LocationInfo.jsx 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code Management/WMS/WIDESEA_WMSClient/src/extension/widesea_wms/basicinfo/demo_Product/LocationChange.vue 137 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code Management/WMS/WIDESEA_WMSClient/src/views/Index.vue 165 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code Management/WMS/WIDESEA_WMSClient/src/views/Login.vue 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code Management/WMS/WIDESEA_WMSClient/src/views/system/UserInfo.vue 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/basicinfo/Dt_LocationInfo.vue 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/basicinfo/LocationStatusChange.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code Management/WMS/WIDESEA_WMSServer/WIDESEA_Common/StatusChangeType/StatusChangeTypeEnum.cs 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code Management/WMS/WIDESEA_WMSServer/WIDESEA_Core/Utilities/EntityProperties.cs 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code Management/WMS/WIDESEA_WMSServer/WIDESEA_DTO/Location/LocationChangeRecordDto.cs 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code Management/WMS/WIDESEA_WMSServer/WIDESEA_IStorageBasicRepository/Location/ILocationStatusChangeRecordRepository.cs 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code Management/WMS/WIDESEA_WMSServer/WIDESEA_IStorageTaskRepository/Task/ITaskExecuteDetailRepository.cs 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StorageBasicRepository/Location/LocationStatusChangeRecordRepository.cs 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StorageBasicServices/Location/LocationInfoService.cs 24 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StorageTaskRepository/Task/TaskExecuteDetailRepository.cs 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StorageTaskServices/Task/Dt_TaskService.cs 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code Management/WMS/WIDESEA_WMSClient/src/components/basic/VolTable.vue
@@ -1,129 +1,59 @@
<template>
  <!-- 2021.11.18移除voltable方法@cell-mouse-leave="rowEndEdit" -->
  <div
    class="vol-table"
    :class="[
  <div class="vol-table" :class="[
      textInline ? 'text-inline' : '',
      fxRight ? 'fx-right' : '',
      isChrome ? 'chrome' : '',
      smallCell?'small-table':''
    ]"
  >
  ]">
    <div class="mask" v-show="loading"></div>
    <div class="message" v-show="loading">加载中.....</div>
    <el-table
      :show-summary="summary"
      :summary-method="getSummaryData"
      :row-key="rowKey"
      :key="randomTableKey"
      :lazy="lazy"
      :defaultExpandAll="defaultExpandAll"
      :expand-row-keys="rowKey ? expandRowKeys : undefined"
      stripe
      :load="loadTreeChildren"
      @select="userSelect"
      @select-all="userSelect"
      @selection-change="selectionChange"
      @row-dblclick="rowDbClick"
      @row-click="rowClick"
      @header-click="headerClick"
      :highlight-current-row="highlightCurrentRow"
      ref="table"
      class="v-table"
      @sort-change="sortChange"
      tooltip-effect="dark"
      :height="realHeight"
      :max-height="realMaxHeight"
      :data="url ? rowData : tableData"
      border
      :row-class-name="initIndex"
      :cell-style="getCellStyle"
      style="width: 100%"
      :scrollbar-always-on="true"
      :span-method="cellSpanMethod"
      @expand-change="expandChange"
    >
      <el-table-column
        v-if="columnIndex"
        type="index"
        :fixed="fixed"
        width="55"
      ></el-table-column>
      <el-table-column
        v-if="ck"
        type="selection"
        :fixed="fixed"
        :selectable="selectable"
        width="55"
      ></el-table-column>
    <el-table :show-summary="summary" :summary-method="getSummaryData" :row-key="rowKey" :key="randomTableKey"
      :lazy="lazy" :defaultExpandAll="defaultExpandAll" :expand-row-keys="rowKey ? expandRowKeys : undefined" stripe
      :load="loadTreeChildren" @select="userSelect" @select-all="userSelect" @selection-change="selectionChange"
      @row-dblclick="rowDbClick" @row-click="rowClick" @header-click="headerClick"
      :highlight-current-row="highlightCurrentRow" ref="table" class="v-table" @sort-change="sortChange"
      tooltip-effect="dark" :height="realHeight" :max-height="realMaxHeight" :data="url ? rowData : tableData" border
      :row-class-name="initIndex" :cell-style="getCellStyle" style="width: 100%" :scrollbar-always-on="true"
      :span-method="cellSpanMethod" @expand-change="expandChange">
      <el-table-column v-if="columnIndex" type="index" :fixed="fixed" width="55"></el-table-column>
      <el-table-column v-if="ck" type="selection" :fixed="fixed" :selectable="selectable" width="55"></el-table-column>
      <!-- 2020.10.10移除table第一行强制排序 -->
      <el-table-column
        v-for="(column, cindex) in filterColumns"
        :prop="column.field"
        :label="column.title"
        :min-width="column.width"
        :formatter="formatter"
        :fixed="column.fixed"
        :key="column.field + cindex"
        :align="column.align"
        :sortable="column.sort ? 'custom' : false"
        :show-overflow-tooltip="column.showOverflowTooltip"
      >
      <el-table-column v-for="(column, cindex) in filterColumns" :prop="column.field" :label="column.title"
        :min-width="column.width" :formatter="formatter" :fixed="column.fixed" :key="column.field + cindex"
        :align="column.align" :sortable="column.sort ? 'custom' : false"
        :show-overflow-tooltip="column.showOverflowTooltip">
        <template #header>
          <span
            v-if="(column.require || column.required) && column.edit"
            class="column-required"
            >*</span
          >{{ column.title }}
          <span v-if="(column.require || column.required) && column.edit" class="column-required">*</span>{{
            column.title }}
        </template>
        <template #default="scope">
          <!-- 2022.01.08增加多表头,现在只支持常用功能渲染,不支持编辑功能(涉及到组件重写) -->
          <el-table-column
            style="border: none"
            v-for="columnChildren in filterChildrenColumn(column.children)"
            :key="columnChildren.field"
            :min-width="columnChildren.width"
            :class-name="columnChildren.class"
            :prop="columnChildren.field"
            :align="columnChildren.align"
            :label="columnChildren.title"
          >
          <el-table-column style="border: none" v-for="columnChildren in filterChildrenColumn(column.children)"
            :key="columnChildren.field" :min-width="columnChildren.width" :class-name="columnChildren.class"
            :prop="columnChildren.field" :align="columnChildren.align" :label="columnChildren.title">
            <template #default="scopeChildren">
              <a
                href="javascript:void(0);"
                style="text-decoration: none"
                @click="link(scopeChildren.row, columnChildren, $event)"
                v-if="columnChildren.link"
                v-text="scopeChildren.row[columnChildren.field]"
              ></a>
              <table-render
                  v-else-if="columnChildren.render && typeof columnChildren.render == 'function'"
                  :row="scopeChildren.row"
                  key="rd-01"
                  :index="scope.$index"
                  :column="columnChildren"
                  :render="columnChildren.render"
                ></table-render>
              <div
                v-else-if="columnChildren.formatter"
                @click="
              <a href="javascript:void(0);" style="text-decoration: none"
                @click="link(scopeChildren.row, columnChildren, $event)" v-if="columnChildren.link"
                v-text="scopeChildren.row[columnChildren.field]"></a>
              <table-render v-else-if="columnChildren.render && typeof columnChildren.render == 'function'"
                :row="scopeChildren.row" key="rd-01" :index="scope.$index" :column="columnChildren"
                :render="columnChildren.render"></table-render>
              <div v-else-if="columnChildren.formatter" @click="
                  columnChildren.click &&
                    columnChildren.click(
                      scopeChildren.row,
                      columnChildren,
                      scopeChildren.$index
                    )
                "
                v-html="
                  columnChildren.formatter(
                " v-html="columnChildren.formatter(
                    scopeChildren.row,
                    columnChildren,
                    scopeChildren.$index
                  )
                "
              ></div>
                  "></div>
              <div v-else-if="columnChildren.bind">
                {{ formatter(scopeChildren.row, columnChildren, true) }}
              </div>
@@ -136,14 +66,8 @@
            </template>
          </el-table-column>
          <!-- 2020.06.18增加render渲染自定义内容 -->
          <table-render
            v-if="column.render && typeof column.render == 'function'"
            :row="scope.row"
            key="rd-01"
            :index="scope.$index"
            :column="column"
            :render="column.render"
          ></table-render>
          <table-render v-if="column.render && typeof column.render == 'function'" :row="scope.row" key="rd-01"
            :index="scope.$index" :column="column" :render="column.render"></table-render>
          <!-- å¯ç”¨åŒå‡»ç¼–辑功能,带编辑功能的不会渲染下拉框文本背景颜色 -->
          <!-- @click="rowBeginEdit(scope.$index,cindex)" -->
          <!-- 2021.09.21增加编辑时对readonly属性判断 -->
@@ -153,178 +77,92 @@
                  style="padding: 3px;margin-right: 10px;color:#8f9293;cursor: pointer;" 
                  @click="showUpload(scope.row, column)" class="el-icon-upload"></i>    
                   <template v-if="column.edit.type == 'img'">
                    <img
                    v-for="(file, imgIndex) in getFilePath(
                <img v-for="(file, imgIndex) in getFilePath(
                      scope.row[column.field],
                      column
                    )"
                    :key="imgIndex"
                    @error="handleImageError"
                    @click="viewImg(scope.row, column, file.path, $event,imgIndex)"
                    class="table-img"
                    :src="file.path"
                  />
                )" :key="imgIndex" @error="handleImageError"
                  @click="viewImg(scope.row, column, file.path, $event, imgIndex)" class="table-img" :src="file.path" />
                   </template>
                  <a
                    style="margin-right: 8px"
                    v-else
                    class="t-file"
                    v-for="(file, fIndex) in getFilePath(
              <a style="margin-right: 8px" v-else class="t-file" v-for="(file, fIndex) in getFilePath(
                      scope.row[column.field],
                      column
                    )"
                    :key="fIndex"
                    @click="dowloadFile(file)"
                    >{{ file.name }}</a
                  >
              )" :key="fIndex" @click="dowloadFile(file)">{{ file.name }}</a>
                </div>
          </template>
          <div
            v-else-if="
          <div v-else-if="
              column.edit &&
                !column.readonly &&
                (column.edit.keep || edit.rowIndex == scope.$index)
            "
            class="edit-el"
          >
          " class="edit-el">
            <div @click.stop class="e-item">
              <div>
                <!-- 2020.07.24增加日期onChange事件 -->
                <el-date-picker
                  clearable
                  size="default"
                  style="width: 100%"
                  v-if="['date', 'datetime'].indexOf(column.edit.type) != -1"
                  v-model="scope.row[column.field]"
                  @change="
                    (val) => {
                <el-date-picker clearable size="default" style="width: 100%"
                  v-if="['date', 'datetime'].indexOf(column.edit.type) != -1" v-model="scope.row[column.field]" @change="(val) => {
                      column.onChange &&
                        column.onChange(scope.row, column, val);
                    }
                  "
                  :type="column.edit.type"
                  :placeholder="column.placeholder || column.title"
                  :disabledDate="(val) => getDateOptions(val, column)"
                  :value-format="getDateFormat(column)"
                  :disabled="initColumnDisabled(scope.row, column)"
                >
                    " :type="column.edit.type" :placeholder="column.placeholder || column.title"
                  :disabledDate="(val) => getDateOptions(val, column)" :value-format="getDateFormat(column)"
                  :disabled="initColumnDisabled(scope.row, column)">
                </el-date-picker>
                <el-time-picker
                  clearable
                  size="default"
                  style="width: 100%"
                  v-else-if="column.edit.type == 'time'"
                  v-model="scope.row[column.field]"
                  @change="
                    (val) => {
                <el-time-picker clearable size="default" style="width: 100%" v-else-if="column.edit.type == 'time'"
                  v-model="scope.row[column.field]" @change="(val) => {
                      column.onChange &&
                        column.onChange(scope.row, column, val);
                    }
                  "
                  :placeholder="column.placeholder || column.title"
                  :value-format="column.format || 'HH:mm:ss'"
                  :disabled="initColumnDisabled(scope.row, column)"
                >
                    " :placeholder="column.placeholder || column.title" :value-format="column.format || 'HH:mm:ss'"
                  :disabled="initColumnDisabled(scope.row, column)">
                </el-time-picker>
                <el-switch
                  v-else-if="column.edit.type == 'switch'"
                  v-model="scope.row[column.field]"
                  active-color="#0f84ff"
                  inactive-color="rgb(194 194 194)"
                  active-text="是"
                  inactive-text="否"
                  inline-prompt
                  @change="
                    (val) => {
                <el-switch v-else-if="column.edit.type == 'switch'" v-model="scope.row[column.field]"
                  active-color="#0f84ff" inactive-color="rgb(194 194 194)" active-text="是" inactive-text="否"
                  inline-prompt @change="(val) => {
                      switchChange(val, scope.row, column);
                    }
                  "
                  :active-value="
                    typeof scope.row[column.field] == 'boolean'
                    " :active-value="typeof scope.row[column.field] == 'boolean'
                      ? true
                      : typeof scope.row[column.field] == 'string'
                      ? '1'
                      : 1
                  "
                  :inactive-value="
                    typeof scope.row[column.field] == 'boolean'
                    " :inactive-value="typeof scope.row[column.field] == 'boolean'
                      ? false
                      : typeof scope.row[column.field] == 'string'
                      ? '0'
                      : 0
                  "
                  :disabled="initColumnDisabled(scope.row, column)"
                >
                    " :disabled="initColumnDisabled(scope.row, column)">
                </el-switch>
                <template
                  v-else-if="
                <template v-else-if="
                    ['select', 'selectList'].indexOf(column.edit.type) != -1
                  "
                >
                  <el-select-v2
                    style="width: 100%"
                    :size="size"
                    v-if="column.bind.data.length >= select2Count"
                    v-model="scope.row[column.field]"
                    filterable
                    :multiple="column.edit.type == 'select' ? false : true"
                    :placeholder="column.placeholder || column.title"
                    :autocomplete="column.autocomplete"
                    :options="column.bind.data"
                    @change="
                ">
                  <el-select-v2 style="width: 100%" :size="size" v-if="column.bind.data.length >= select2Count"
                    v-model="scope.row[column.field]" filterable :multiple="column.edit.type == 'select' ? false : true"
                    :placeholder="column.placeholder || column.title" :autocomplete="column.autocomplete"
                    :options="column.bind.data" @change="
                      column.onChange && column.onChange(scope.row, column)
                    "
                    clearable
                    :disabled="initColumnDisabled(scope.row, column)"
                  >
                      " clearable :disabled="initColumnDisabled(scope.row, column)">
                    <template #default="{ item }">
                      {{ item.label }}
                    </template>
                  </el-select-v2>
                  <el-select
                    size="default"
                    style="width: 100%"
                    v-else
                    v-model="scope.row[column.field]"
                    :filterable="
                      column.filter || column.bind.data.length > 10
                  <el-select size="default" style="width: 100%" v-else v-model="scope.row[column.field]" :filterable="column.filter || column.bind.data.length > 10
                        ? true
                        : false
                    "
                    :multiple="column.edit.type == 'select' ? false : true"
                    :placeholder="column.placeholder || column.title"
                    :allow-create="column.autocomplete"
                    @change="
                    " :multiple="column.edit.type == 'select' ? false : true"
                    :placeholder="column.placeholder || column.title" :allow-create="column.autocomplete" @change="
                      column.onChange && column.onChange(scope.row, column)
                    "
                    clearable
                    :disabled="initColumnDisabled(scope.row, column)"
                  >
                    <el-option
                      v-for="item in column.bind.data"
                      :key="item.key"
                      v-show="!item.hidden"
                      :disabled="item.disabled"
                      :label="item.value"
                      :value="item.key"
                      >{{ item.value }}
                      " clearable :disabled="initColumnDisabled(scope.row, column)">
                    <el-option v-for="item in column.bind.data" :key="item.key" v-show="!item.hidden"
                      :disabled="item.disabled" :label="item.value" :value="item.key">{{ item.value }}
                    </el-option>
                  </el-select>
                </template>
                <el-tree-select
                  style="width: 100%"
                <el-tree-select style="width: 100%"
                  v-else-if="column.edit.type == 'treeSelect'||column.edit.type == 'cascader'"
                  v-model="scope.row[column.field]"
                  :data="column.bind.data"
                  :multiple="column.multiple===undefined?true:column.multiple"
                  :render-after-expand="false"
                  :show-checkbox="true"
                  :check-strictly="column.checkStrictly===undefined?true:column.checkStrictly"
                  check-on-click-node
                  node-key="key"
                  @change="column.onChange && column.onChange(scope.row, column)"
                  v-model="scope.row[column.field]" :data="column.bind.data"
                  :multiple="column.multiple === undefined ? true : column.multiple" :render-after-expand="false"
                  :show-checkbox="true" :check-strictly="column.checkStrictly === undefined ? true : column.checkStrictly"
                  check-on-click-node node-key="key" @change="column.onChange && column.onChange(scope.row, column)"
                  :props="{ label: 'label' }">
                   <template #default="{ data, node }">
                  {{data.label}}</template>
@@ -342,41 +180,21 @@
                  @change="column.onChange && column.onChange(scope.row, column)"
                >
                </el-cascader> -->
                <el-input
                  v-else-if="column.edit.type == 'textarea'"
                  type="textarea"
                  :placeholder="column.placeholder || column.title"
                  v-model="scope.row[column.field]"
                  :disabled="initColumnDisabled(scope.row, column)"
                >
                <el-input v-else-if="column.edit.type == 'textarea'" type="textarea"
                  :placeholder="column.placeholder || column.title" v-model="scope.row[column.field]"
                  :disabled="initColumnDisabled(scope.row, column)">
                </el-input>
                <input
                  class="table-input"
                  v-else-if="!column.summary && !column.onKeyPress"
                  v-model.lazy="scope.row[column.field]"
                  :placeholder="column.placeholder || column.title"
                  :disabled="initColumnDisabled(scope.row, column)"
                />
                <el-input
                  v-else
                  @change="inputKeyPress(scope.row, column, $event)"
                <input class="table-input" v-else-if="!column.summary && !column.onKeyPress"
                  v-model.lazy="scope.row[column.field]" :placeholder="column.placeholder || column.title"
                  :disabled="initColumnDisabled(scope.row, column)" />
                <el-input v-else @change="inputKeyPress(scope.row, column, $event)"
                  @input="inputKeyPress(scope.row, column, $event)"
                  @keyup.enter="inputKeyPress(scope.row, column, $event)"
                  size="default"
                  v-model="scope.row[column.field]"
                  :placeholder="column.placeholder || column.title"
                  :disabled="initColumnDisabled(scope.row, column)"
                ></el-input>
                  @keyup.enter="inputKeyPress(scope.row, column, $event)" size="default"
                  v-model="scope.row[column.field]" :placeholder="column.placeholder || column.title"
                  :disabled="initColumnDisabled(scope.row, column)"></el-input>
              </div>
              <div
                class="extra"
                v-if="column.extra && edit.rowIndex == scope.$index"
              >
                <a
                  :style="column.extra.style"
                  style="text-decoration: none"
                  @click="extraClick(scope.row, column)"
                >
              <div class="extra" v-if="column.extra && edit.rowIndex == scope.$index">
                <a :style="column.extra.style" style="text-decoration: none" @click="extraClick(scope.row, column)">
                  <i v-if="column.extra.icon" :class="[column.extra.icon]" />
                  {{ column.extra.text }}
                </a>
@@ -385,75 +203,39 @@
          </div>
          <!--没有编辑功能的直接渲染标签-->
          <template v-else>
            <a
              href="javascript:void(0)"
              style="text-decoration: none;line-height: 1.3;"
              @click="link(scope.row, column, $event)"
              v-if="column.link"
              v-text="scope.row[column.field]"
            ></a>
            <img
              v-else-if="column.type == 'img'"
              v-for="(file, imgIndex) in getFilePath(
            <a href="javascript:void(0)" style="text-decoration: none;line-height: 1.3;"
              @click="link(scope.row, column, $event)" v-if="column.link" v-text="scope.row[column.field]"></a>
            <img v-else-if="column.type == 'img'" v-for="(file, imgIndex) in getFilePath(
                scope.row[column.field],
                column
              )"
              :key="imgIndex"
              @error="handleImageError"
              @click="viewImg(scope.row, column, file.path, $event, imgIndex)"
              class="table-img"
              :src="file.path"
            />
            <a
              style="margin-right: 8px"
              v-else-if="column.type == 'file' || column.type == 'excel'"
              class="t-file"
            )" :key="imgIndex" @error="handleImageError"
              @click="viewImg(scope.row, column, file.path, $event, imgIndex)" class="table-img" :src="file.path" />
            <a style="margin-right: 8px" v-else-if="column.type == 'file' || column.type == 'excel'" class="t-file"
              v-for="(file, fIndex) in getFilePath(
                scope.row[column.field],
                column
              )"
              :key="fIndex"
              @click="dowloadFile(file)"
              >{{ file.name }}</a
            >
              )" :key="fIndex" @click="dowloadFile(file)">{{ file.name }}</a>
            <span v-else-if="column.type == 'date'">{{
              formatterDate(scope.row, column)
            }}</span>
            <div
              v-else-if="column.formatter"
              @click="formatterClick(scope.row, column, $event)"
              v-html="column.formatter(scope.row, column)"
            ></div>
            <div v-else-if="column.formatter" @click="formatterClick(scope.row, column, $event)"
              v-html="column.formatter(scope.row, column)"></div>
            <!-- 2021.11.18修复table数据源设置为normal后点击行$event缺失的问题 -->
            <div
              v-else-if="column.bind && (column.normal || column.edit)"
            <div v-else-if="column.bind && (column.normal || column.edit)"
              @click="formatterClick(scope.row, column, $event)"
              :style="column.getStyle && column.getStyle(scope.row, column)"
            >
              :style="column.getStyle && column.getStyle(scope.row, column)">
              {{ formatter(scope.row, column, true) }}
            </div>
            <div
              v-else-if="column.click && !column.bind"
              @click="formatterClick(scope.row, column)"
            >
            <div v-else-if="column.click && !column.bind" @click="formatterClick(scope.row, column)">
              {{ scope.row[column.field] }}
            </div>
            <div
              @click="
                () => {
            <div @click="() => {
                  column.click && formatterClick(scope.row, column);
                }
              "
              v-else-if="column.bind"
            >
              <el-tag
                v-if="useTag"
                 class="cell-tag"
                :class="[isEmptyTag(scope.row, column)]"
                :type="getColor(scope.row, column)"
                :effect="column.effect"
                >{{ formatter(scope.row, column, true) }}</el-tag
              >
              " v-else-if="column.bind">
              <el-tag v-if="useTag" class="cell-tag" :class="[isEmptyTag(scope.row, column)]"
                :type="getColor(scope.row, column)" :effect="column.effect">{{ formatter(scope.row, column, true)
                }}</el-tag>
              <template v-else>{{
                formatter(scope.row, column, true)
              }}</template>
@@ -467,45 +249,21 @@
    <template v-if="!paginationHide">
      <div class="block pagination" key="pagination-01" style="display: flex">
        <div style="flex: 1"></div>
        <el-pagination
          key="pagination-02"
          @size-change="handleSizeChange"
          @current-change="handleCurrentChange"
          :current-page="paginations.page"
          :page-sizes="paginations.sizes"
          :page-size="paginations.size"
          layout="total, sizes, prev, pager, next, jumper"
          :total="paginations.total"
        ></el-pagination>
        <el-pagination key="pagination-02" @size-change="handleSizeChange" @current-change="handleCurrentChange"
          :current-page="paginations.page" :page-sizes="paginations.sizes" :page-size="paginations.size"
          layout="total, sizes, prev, pager, next, jumper" :total="paginations.total"></el-pagination>
      </div>
    </template>
  </div>
  <VolBox
    v-model="uploadModel"
    title="上传"
    :height="228"
    :width="500"
    :padding="15"
    lazy
  >
  <VolBox v-model="uploadModel" title="上传" :height="228" :width="500" :padding="15" lazy>
    <!-- ä¸Šä¼ å›¾ç‰‡ã€excel或其他文件、文件数量、大小限制都可以,参照volupload组件api -->
    <div style="height: 200px;display: flex;align-items: center;">
      <VolUpload
      style="text-align: center; "
      :autoUpload="currentColumn.edit.autoUpload"
      :multiple="currentColumn.edit.multiple"
      :url="uploadUrl"
      :max-file="currentColumn.edit.maxFile"
      :img="currentColumn.edit.type == 'img'"
      :excel="currentColumn.edit.type == 'excel'"
      :fileTypes="currentColumn.edit.fileTypes ? currentColumn.edit.fileTypes : []"
      :fileInfo="fileInfo"
      :upload-after="uploadAfter"
      :upload-before="uploadBefore"
      :append="currentColumn.edit.accept"
    >
      <VolUpload style="text-align: center; " :autoUpload="currentColumn.edit.autoUpload"
        :multiple="currentColumn.edit.multiple" :url="uploadUrl" :max-file="currentColumn.edit.maxFile"
        :img="currentColumn.edit.type == 'img'" :excel="currentColumn.edit.type == 'excel'"
        :fileTypes="currentColumn.edit.fileTypes ? currentColumn.edit.fileTypes : []" :fileInfo="fileInfo"
        :upload-after="uploadAfter" :upload-before="uploadBefore" :append="currentColumn.edit.accept">
      <div>{{ currentColumn.message}}</div>
    </VolUpload>
    </div>
@@ -1851,6 +1609,7 @@
<style lang="less" scoped>
.vol-table {
  position: relative;
  .mask {
    opacity: 0.2;
    position: absolute;
@@ -1859,6 +1618,7 @@
    background: #d0d0d0;
    z-index: 100;
  }
  .message {
    text-align: center;
    color: #635c5c;
@@ -1878,12 +1638,15 @@
    border: 1px solid #a09e9e;
  }
}
.e-item {
  display: flex;
  > div:first-child {
    flex: 1;
  }
}
.vol-table ::v-deep(.el-pager .number) {
  padding: 0 7px;
  border-radius: 5px;
@@ -1893,10 +1656,12 @@
  min-width: 28px;
  height: 27px;
}
.vol-table ::v-deep(.el-pager .number.active) {
  background: #ed4014;
  color: #fff;
}
.vol-table ::v-deep(.el-pagination .el-input__wrapper) {
  height: 27px;
}
@@ -1907,10 +1672,12 @@
  border-bottom: 1px solid;
  padding-bottom: 2px;
}
.vol-table .empty-tag {
  border: none;
  background: none;
}
.v-table ::v-deep(.el-date-editor .el-icon-date),
.v-table ::v-deep(.el-date-editor .el-icon-time) {
  width: 10px;
@@ -1935,6 +1702,7 @@
  border: 1px solid #eee;
  border-top: 0px;
}
/* .v-table ::v-deep(.el-input .el-input__inner) {
  padding: 0 7px;
} */
@@ -1949,11 +1717,13 @@
.v-table ::v-deep(.el-table__header th.is-sortable) {
  padding: 3px !important;
}
.vol-table.text-inline ::v-deep(.el-table__body .cell),
.vol-table.text-inline ::v-deep(.el-table__header-wrapper .cell) {
  word-break: inherit !important;
  white-space: nowrap !important;
}
/* .v-table  ::v-deep(.el-table__body td) {
  padding: 9px 0 !important;
} */
@@ -1965,6 +1735,7 @@
.vol-table ::v-deep(.el-table-column--selection .cell) {
  display: inline;
}
.vol-table.text-inline ::v-deep(.el-table th > .cell) {
  white-space: nowrap !important;
}
@@ -1976,6 +1747,7 @@
  width: 40px;
  object-fit: cover;
}
.vol-table .table-img:hover {
  cursor: pointer;
}
@@ -1983,9 +1755,11 @@
.vol-table ::v-deep(.cell) {
  padding: 2px 10px;
}
.vol-table ::v-deep(.cell .el-tag) {
  padding: 5px 9px;
}
.table-input {
  color: rgb(104, 103, 103);
  padding: 3px 10px;
@@ -1995,6 +1769,7 @@
  border-radius: 4px;
  border: 1px solid #dcdcdc;
}
.table-input:focus {
  outline: 1px solid #49a3fd;
}
@@ -2002,11 +1777,13 @@
.small-table ::v-deep(.el-pagination .el-input__wrapper) {
  height: 27px;
}
.small-table ::v-deep(.el-table__cell) {
  padding: 6px 0;
  font-size: 13px;
}
.small-table ::v-deep(.cell-tag) {
  padding: 0 5px !important; 
  height: 19px;
Code Management/WMS/WIDESEA_WMSClient/src/extension/widesea_wms/basicinfo/Dt_LocationInfo.jsx
ÎļþÃû´Ó Code Management/WMS/WIDESEA_WMSClient/src/extension/widesea_wms/basicinfo/Dt_LocationInfo.js ÐÞ¸Ä
@@ -6,11 +6,12 @@
**后台操作见:http://v2.volcore.xyz/document/netCoreDev
*****************************************************************************************/
//此js文件是用来自定义扩展业务代码,可以扩展一些自定义页面或者重新配置生成的代码
import {  defineAsyncComponent } from "vue";
let extension = {
  components: {
    //查询界面扩展组件
    gridHeader: '',
    gridHeader: defineAsyncComponent(() =>
      import("./demo_Product/LocationChange.vue")),
    gridBody: '',
    gridFooter: '',
    //新建、编辑弹出框扩展组件
@@ -83,6 +84,32 @@
            }
        //示例:设置修改新建、编辑弹出框字段标签的长度
        this.boxOptions.labelWidth = 150;
        //表格上添加自定义按钮
      this.columns.push({
        title: "操作",
        field: "操作",
        width: 150,
        align: "left", // 'center',
        render: (h, { row, column, index }) => {
          return (
            <div>
              <el-button
                onClick={($e) => {
                  // this.$refs.table.load();
                  // console.log(this.$refs.table);
                  this.$refs.gridHeader.customOpen(row);
                }}
                type="primary"
                plain
                style="height:26px; padding: 10px !important;"
              >
                çŠ¶æ€å˜åŠ¨è®°å½•
              </el-button>
            </div>
          );
        },
      });
    },
    onInited() {
      //框架初始化配置后
Code Management/WMS/WIDESEA_WMSClient/src/extension/widesea_wms/basicinfo/demo_Product/LocationChange.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,137 @@
<template>
    <vol-box :lazy="true" v-model="model" title="货位状态变动记录" :width="1820" :padding="5">
        <div class="table-item">
            <div class="table-item-header">
                <div class="table-item-border"></div> <span class="table-item-text">货位状态变动记录</span>
                <div class="table-item-buttons">
                    <div>
                        <el-button type="primary" @click="reload" color="#95d475" plain>刷新</el-button>
                    </div>
                </div>
            </div>
            <!-- <el-alert type="success" title="" style="line-height: 12px;">
                åŠŸèƒ½ï¼šè¡¨å°¾åˆè®¡ã€æ–‡ä»¶ä¸Šä¼ ã€ç¼–è¾‘ã€api加载数据、自动分页、自定义按钮、行点击事件、加载loadBefore自定义等。。。
            </el-alert> -->
            <vol-table @loadBefore="loadBefore" @loadAfter="loadAfter" ref="table" :url="url" index
                :tableData="tableData" :columns="columns" :height="700" :pagination-hide="false" :load-key="true"
                :column-index="true"></vol-table>
        </div>
        <template #footer>
            <div>
                <el-button type="primary" size="small" @click="model = false">确认</el-button>
                <el-button type="default" size="small" @click="model = false">关闭</el-button>
            </div>
        </template>
    </vol-box>
</template>
<script lang="jsx">
//如果是自定义vue页面使用的配置,在vue页面的script后一定要加上lang="jsx"
import VolTable from "@/components/basic/VolTable.vue";
import VolBox from "@/components/basic/VolBox.vue";
export default {
    components: {
        'vol-table': VolTable,
        'vol-box': VolBox
    },
    data() {
        return {
            model: false,
            locationCode: '',
            //接口返回数据,可以框架生成的接口getPageData
            //如果是自定义的接口,需要返回的数据格式:{total:100,rows:[]}
            url: "api/LocationStatusChangeRecord/getPageData",
            columns: [{ field: 'Id', title: '主键', type: 'int', width: 110, hidden: true, readonly: true, require: true, align: 'left' },
            { field: 'locationId', title: '货位ID', type: 'int', width: 110, hidden: true, readonly: true, require: true, align: 'left' },
            { field: 'locationCode', title: '货位编号', type: 'string', width: 110, require: true, align: 'left' },
            { field: 'beforeStatus', title: '变动前货位状态', type: 'int', width: 120, align: 'left', bind: { key: "LocationState", data: [] } },
            { field: 'afterStatus', title: '变动后货位状态', type: 'int', width: 110, require: true, align: 'left', sort: true, bind: { key: "LocationState", data: [] } },
            { field: 'changeType', title: '变动类型(出库、入库、手动调整)', type: 'string', width: 70, align: 'left', bind: { key: "StatusChangeType", data: [] } },
            { field: 'orderId', title: '单据主键', type: 'string', width: 70, align: 'left', hidden: true },
            { field: 'orderNo', title: '单据编号', type: 'string', width: 110, align: 'left', hidden: true },
            { field: 'orderDetailId', title: '单据明细主键', type: 'string', width: 110, align: 'left', hidden: true },
            { field: 'taskNum', title: '任务号', type: 'string', width: 110, align: 'left' },
            { field: 'remark', title: '备注', type: 'int', width: 110, align: 'left', hidden: true },
            { field: 'creater', title: '创建人', type: 'string', sort: true, width: 110, align: 'left', hidden: true },
            { field: 'createDate', title: '创建时间', type: 'datetime', sort: true, width: 150, align: 'left', sort: true },
            { field: 'modifier', title: '修改人', type: 'string', sort: true, width: 100, align: 'left', hidden: true },
            { field: 'modifyDate', title: '修改时间', type: 'datetime', sort: true, width: 150, hidden: true, align: 'left', sort: true }
            ]
        }
    },
    methods: {
        //自定义按钮
        customOpen(row) {
            this.locationCode = row.locationCode;
            this.model = true;
            this.$nextTick(() => {
                this.$refs.table.load(null, true);
            })
        },
        loadBefore(params, callBack) {//调用后台接口前处理
            //设置查询条件参数
            params.wheres.push({
                name: "locationCode",
                value: this.locationCode,
                displayType: "like"//模糊查询
            })
            //也可以给value设置值,后台自己解析
            // params.value=this.OrderNo
            //查询前方法也可以动态设置url参数
            //params.url='api/xxx/xx?参数1='+this.xx参数
            callBack(true)//false不会调用后台接口
        },
        //查询后方法
        loadAfter(rows, callBack, result) {
            //如果有合计:后台返回合计格式
            // var data = new {
            //     rows: [],//返回的行数据
            //     total: 200,//返回的总行数
            //     //合计
            //     summary: { TotalPrice: 100, TotalQty: 200 }
            // }
            // callBack(true)
        },
        reload() {
            this.$refs.table.load(null, true);
            this.$message.success('查询成功')
        }
    }
}
</script>
<style lang="less" scoped>
.table-item-header {
    display: flex;
    align-items: center;
    padding: 6px;
    .table-item-border {
        height: 15px;
        background: rgb(33, 150, 243);
        width: 5px;
        border-radius: 10px;
        position: relative;
        margin-right: 5px;
    }
    .table-item-text {
        font-weight: bolder;
    }
    .table-item-buttons {
        flex: 1;
        text-align: right;
    }
    .small-text {
        font-size: 12px;
        color: #2196F3;
        margin-left: 10px;
        position: relative;
        top: 2px;
    }
}
</style>
Code Management/WMS/WIDESEA_WMSClient/src/views/Index.vue
@@ -7,30 +7,19 @@
      </div>
      <div class="vol-menu">
        <el-scrollbar style="height: 100%">
          <VolMenu
            :currentMenuId="currentMenuId"
            :on-select="onSelect"
            :enable="true"
            :open-select="false"
            :isCollapse="isCollapse"
            :list="menuOptions"
          ></VolMenu>
          <VolMenu :currentMenuId="currentMenuId" :on-select="onSelect" :enable="true" :open-select="false"
            :isCollapse="isCollapse" :list="menuOptions"></VolMenu>
        </el-scrollbar>
      </div>
    </div>
    <div class="vol-container" :style="{ left: menuWidth - 1 + 'px' }">
      <div class="vol-header">
        <div class="project-name">Vol开发框架Vue3版本</div>
        <div class="project-name">WIDESEA_WMS</div>
        <div class="header-text">
          <div class="h-link">
            <a
              href="javascript:void(0)"
              @click="to(item)"
              v-for="(item, index) in links.filter((c) => {
            <a href="javascript:void(0)" @click="to(item)" v-for="(item, index) in links.filter((c) => {
                return !c.icon;
              })"
              :key="index"
            >
            })" :key="index">
              <span v-if="!item.icon"> {{ item.text }}</span>
              <i v-else :class="item.icon"></i>
            </a>
@@ -38,14 +27,9 @@
        </div>
        <div class="header-info">
          <div class="h-link">
            <a
              href="javascript:void(0)"
              @click="to(item)"
              v-for="(item, index) in links.filter((c) => {
            <a href="javascript:void(0)" @click="to(item)" v-for="(item, index) in links.filter((c) => {
                return c.icon;
              })"
              :key="index"
            >
            })" :key="index">
              <span v-if="!item.icon"> {{ item.text }}</span>
              <i v-else :class="item.icon"></i>
            </a>
@@ -62,65 +46,37 @@
            <span id="index-date"></span>
          </div>
          <div class="settings">
            <i
              style="font-size: 20px"
              class="el-icon-s-tools"
              @click="drawer_model = true"
            />
            <i style="font-size: 20px" class="el-icon-s-tools" @click="drawer_model = true" />
          </div>
        </div>
      </div>
      <div class="vol-path">
        <el-tabs
          @tab-click="selectNav"
          @tab-remove="removeNav"
          @contextmenu.prevent="bindRightClickMenu(false)"
          type="border-card"
          class="header-navigation"
          v-model="selectId"
          :strtch="false"
        >
          <el-tab-pane
            v-for="(item, navIndex) in navigation"
            type="card"
            :name="navIndex + ''"
            :closable="navIndex > 0"
            :key="navIndex"
            :label="item.name"
          >
        <el-tabs @tab-click="selectNav" @tab-remove="removeNav" @contextmenu.prevent="bindRightClickMenu(false)"
          type="border-card" class="header-navigation" v-model="selectId" :strtch="false">
          <el-tab-pane v-for="(item, navIndex) in navigation" type="card" :name="navIndex + ''" :closable="navIndex > 0"
            :key="navIndex" :label="item.name">
            <span style="display: none">{{ navIndex }}</span>
          </el-tab-pane>
        </el-tabs>
        <!-- å³é”®èœå• -->
        <div v-show="contextMenuVisible">
          <ul
            :style="{ left: menuLeft + 'px', top: menuTop + 'px' }"
            class="contextMenu"
          >
          <ul :style="{ left: menuLeft + 'px', top: menuTop + 'px' }" class="contextMenu">
            <li v-show="visibleItem.all">
              <el-button link @click="closeTabs()">
                <i class="el-icon-close"></i>
                {{
                  navigation.length == 2 ? "关闭菜单" : "关闭所有"
                }}</el-button
              >
                }}</el-button>
            </li>
            <li v-show="visibleItem.left">
              <el-button link @click="closeTabs('left')"
                ><i class="el-icon-back"></i>关闭左边</el-button
              >
              <el-button link @click="closeTabs('left')"><i class="el-icon-back"></i>关闭左边</el-button>
            </li>
            <li v-show="visibleItem.right">
              <el-button link @click="closeTabs('right')" >
                <i class="el-icon-right"></i>关闭右边</el-button
              >
                <i class="el-icon-right"></i>关闭右边</el-button>
            </li>
            <li v-show="visibleItem.other">
              <el-button
              link
                @click="closeTabs('other')"
                ><i class="el-icon-right"></i>关闭其他
              <el-button link @click="closeTabs('other')"><i class="el-icon-right"></i>关闭其他
              </el-button>
            </li>
          </ul>
@@ -131,52 +87,27 @@
          <loading v-show="$store.getters.isLoading()"></loading>
          <router-view v-slot="{ Component }">
            <keep-alive>
              <component
                :is="Component"
                :key="$route.name"
                v-if="!$route.meta ||($route.meta && !$route.meta.hasOwnProperty('keepAlive'))"
              />
              <component :is="Component" :key="$route.name"
                v-if="!$route.meta || ($route.meta && !$route.meta.hasOwnProperty('keepAlive'))" />
            </keep-alive>
            <component
              :is="Component"
              :key="$route.name"
              v-if="$route.meta && $route.meta.hasOwnProperty('keepAlive')"
            />
            <component :is="Component" :key="$route.name"
              v-if="$route.meta && $route.meta.hasOwnProperty('keepAlive')" />
          </router-view>
        </el-scrollbar>
      </div>
    </div>
    <el-drawer
      title="选择主题"
      v-model="drawer_model"
      direction="rtl"
      destroy-on-close
    >
    <el-drawer title="选择主题" v-model="drawer_model" direction="rtl" destroy-on-close>
      <div class="theme-selector">
        <div
          @click="changeTheme(item.name)"
          class="item"
          v-for="(item, index) in theme_color"
          :key="index"
          :style="{ background: item.color }"
        >
          <div
            v-show="item.leftColor"
            :style="{ background: item.leftColor }"
            style="height: 100%; width: 20px"
            class="t-left"
          ></div>
        <div @click="changeTheme(item.name)" class="item" v-for="(item, index) in theme_color" :key="index"
          :style="{ background: item.color }">
          <div v-show="item.leftColor" :style="{ background: item.leftColor }" style="height: 100%; width: 20px"
            class="t-left"></div>
          <div class="t-right"></div>
        </div>
      </div>
    </el-drawer>
    <el-drawer
      title="消息列表"
      v-model="messageModel"
      direction="rtl"
      destroy-on-close
    >
    <el-drawer title="消息列表" v-model="messageModel" direction="rtl" destroy-on-close>
      <Message :list="messageList"></Message>
    </el-drawer>
  </div>
@@ -245,21 +176,21 @@
      { name: "white", color: "#fff" },
    ]);
    const links = ref([
      {
        text: "框架视频",
        path: "https://www.cctalk.com/m/group/90268531",
        id: -3,
      },
      { text: "大屏数据", path: "/bigdata", id: -3 },
      {
        text: "框架文档",
        path: "http://v2.volcore.xyz/document/guide",
        id: -2,
      },   {
        text: "框架企业版",
        path: "http://pro.volcore.xyz/",
        id: 10,
      },
      //{
      // text: "框架视频",
      // path: "https://www.cctalk.com/m/group/90268531",
      // id: -3,
      //},
      //{ text: "大屏数据", path: "/bigdata", id: -3 },
      //{
      //  text: "框架文档",
      //  path: "http://v2.volcore.xyz/document/guide",
      //  id: -2,
      //},   {
      //  text: "框架企业版",
      //  path: "http://pro.volcore.xyz/",
      //  id: 10,
      //},
      { text: "个人中心", path: "/UserInfo", id: -1, icon: "el-icon-s-custom" },
      {
        text: "安全退出",
@@ -746,7 +677,9 @@
  font-size: 14px;
  color: #333;
  box-shadow: 2px 2px 3px 0 rgb(182 182 182 / 20%);
  i,button{
  i,
  button {
    font-size: 14px !important;
  }
}
@@ -767,12 +700,8 @@
  letter-spacing: 1px;
}
.el-tabs.el-tabs--top.el-tabs--border-card.header-navigation
  > .el-tabs__header
  .el-tabs__item:last-child,
.el-tabs--top.el-tabs--border-card.header-navigation
  > .el-tabs__header
  .el-tabs__item:nth-child(2) {
.el-tabs.el-tabs--top.el-tabs--border-card.header-navigation>.el-tabs__header .el-tabs__item:last-child,
.el-tabs--top.el-tabs--border-card.header-navigation>.el-tabs__header .el-tabs__item:nth-child(2) {
  padding: 0;
}
Code Management/WMS/WIDESEA_WMSClient/src/views/Login.vue
@@ -1,6 +1,6 @@
<template>
  <div class="login-container">
    <div class="project-name">VOL开发框架,Vue3版本</div>
    <div class="project-name">WIDESEA_WMS</div>
    <div class="login-form">
      <div class="form-user" @keypress="loginPress">
        <div class="login-text">
@@ -41,18 +41,18 @@
      </div>
      <!-- è´¦å·ä¿¡æ¯ -->
      <div class="account-info">
      <!-- <div class="account-info">
        <p>演示账号:admin666 &nbsp; &nbsp;密码:123456</p>
        <p>本地账号:admin &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;密码:123456</p>
        <p><a href="https://jq.qq.com/?_wv=1027&k=Sqstuy0M" style="text-decoration: none"
            target="_blank">QQ3群:743852316(满)</a>
          &nbsp; &nbsp;&nbsp; &nbsp;
          <a href="https://qm.qq.com/cgi-bin/qm/qr?k=YRZBbf64qsUeEmh24I65u2aIZFn2C-Ha&jump_from=webapi&qr=1" style="text-decoration: none" target="_blank">QQ4群:959924606</a>
          <a href="https://qm.qq.com/cgi-bin/qm/qr?k=YRZBbf64qsUeEmh24I65u2aIZFn2C-Ha&jump_from=webapi&qr=1" style="text-decoration: none" target="_blank">QQ4群:959924606</a> -->
          <!-- <a href="http://v2.volcore.xyz/document/guide" style="text-decoration: none" target="_blank">框架文档</a> -->
        </p>
      </div>
        <!-- </p>
      </div> -->
      <!-- é“¾æŽ¥ä½ç½® -->
      <div class="app-link" >
      <!-- <div class="app-link" >
        <a href="#" style="text-decoration: none">移动端扫码</a>
        <a>
          <i class="el-icon-chat-dot-round"></i> å°ç¨‹åº
@@ -65,11 +65,11 @@
          <i class="el-icon-document"></i>
          H5
          <img src="https://app-1256993465.cos.ap-nanjing.myqcloud.com/H5.png" /></a>
      </div>
      </div> -->
    </div>
    <!-- é¡µé¢åº•部 -->
    <div class="login-footer">
    <!-- <div class="login-footer">
      <a style="text-decoration: none" href="https://beian.miit.gov.cn/" target="_blank">京ICP备19056538号-1</a>
@@ -77,7 +77,7 @@
      <a href="https://space.bilibili.com/525836469" style="text-decoration: none" target="blank">NET视频教程(微软MVP-ACE录制)</a>
      <a href="https://www.cctalk.com/m/group/90268531" style="text-decoration: none" target="blank">VOL框架视频</a>
      <a href="http://demo.volcore.xyz" style="text-decoration: none" target="blank">视频演示地址</a>
    </div>
    </div> -->
    <img class="login-bg" src="/static/login_bg.png" />
  </div>
Code Management/WMS/WIDESEA_WMSClient/src/views/system/UserInfo.vue
@@ -62,7 +62,7 @@
        return this.$message.error("两次密码不一致");
      }
      let url =
        "/api/user/modifyPwd?oldPwd=" +
        "/api/Sys_User/modifyPwd?oldPwd=" +
        this.modifyOptions.fields.oldPwd +
        "&newPwd=" +
        this.modifyOptions.fields.newPwd;
@@ -77,7 +77,7 @@
    },
    modifyInfo() {
      this.$refs.form.validate(() => {
        this.http.post('api/user/updateUserInfo', this.userInfo).then(result => {
        this.http.post('api/Sys_User/updateUserInfo', this.userInfo).then(result => {
          this.$message.success(result);
          let userInfo = this.$store.getters.getUserInfo();
          userInfo.img = this.userInfo.headImageUrl;
@@ -94,7 +94,7 @@
      var forms = new FormData();
      let file = e.target.files[0]
      forms.append('fileInput', file, file.name);
      const url = 'api/sys_user/upload'
      const url = 'api/Sys_User/upload'
      this.http
        .post(url, forms, true, {
          headers:{'Content-Type':'multipart/form-data'}
@@ -108,7 +108,7 @@
    }
  },
  created() {
    this.http.post("/api/user/getCurrentUserInfo", {}, true).then((x) => {
    this.http.post("/api/Sys_User/getCurrentUserInfo", {}, true).then((x) => {
      if (!x.status) {
        return this.$message(x.message);
      }
Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/basicinfo/Dt_LocationInfo.vue
@@ -11,28 +11,22 @@
    </view-grid>
</template>
<script>
import extend from "@/extension/widesea_wms/basicinfo/Dt_LocationInfo.js";
import extend from "@/extension/widesea_wms/basicinfo/Dt_LocationInfo.jsx";
import { ref, defineComponent } from "vue";
export default defineComponent({
    setup() {
        const table = ref({
            key: 'locationID',
            key: 'id',
            footer: "Foots",
            cnName: '货位信息',
            name: 'basicinfo/Dt_LocationInfo',
            url: "/LocationInfo/",
            sortName: "LocationID"
            sortName: "id"
        });
        const editFormFields = ref({ "status": "", "scNo": "", "roadWayNO": "", "locationCode": "", "wareAreaCode": "" });
        const editFormFields = ref({ "locationStatus": "" });
        const editFormOptions = ref([
            [
                { "title": "货位编号", "field": "locationCode", type: "text" },
                { "title": "货位状态", "field": "status", "type": "select", dataKey: "LocationState", data: [] },
                { "title": "对应堆垛机号", "field": "scNo", type: "text" },
                { "title": "巷道编号", "field": "roadWayNO", type: "text" },
            ], [
                { "title": "库区编号", "field": "wareAreaCode", type: "text" },
                { "title": "货位状态", "field": "locationStatus", "type": "select", dataKey: "LocationState", data: [] },
            ]
        ]);
        const searchFormFields = ref({ "LocationID": "" });
@@ -47,16 +41,16 @@
        const columns = ref([{ field: 'locationID', title: '货位ID', type: 'int', width: 110, hidden: true, readonly: true, require: true, align: 'left' },
        { field: 'locationCode', title: '货位编号', type: 'string', width: 110, require: true, align: 'left' },
        { field: 'locationName', title: '货位名称', type: 'string', width: 120, align: 'left' },
        { field: 'roadWayNO', title: '巷道号', type: 'string', width: 110, require: true, align: 'left', sort: true },
        { field: 'roadwayNo', title: '巷道号', type: 'string', width: 110, require: true, align: 'left', sort: true },
        { field: 'row', title: '行', type: 'string', width: 70, align: 'left' },
        { field: 'column', title: '列', type: 'string', width: 70, align: 'left' },
        { field: 'layer', title: '层', type: 'string', width: 110, align: 'left' },
        { field: 'depth', title: '深度', type: 'string', width: 110, align: 'left' },
        { field: 'scNo', title: '对应堆垛机号', type: 'string', width: 110, align: 'left' },
        { field: 'locationType', title: '货位类型', type: 'int', width: 110, align: 'left' },
        { field: 'scNo', title: '对应堆垛机号', type: 'string', width: 110, align: 'left', hidden: true },
        { field: 'locationType', title: '货位类型', type: 'int', width: 110, align: 'left', bind: { key: "locationType", data: [] } },
        { field: 'locationStatus', title: '货位状态', type: 'int', width: 110, align: 'left', bind: { key: "LocationState", data: [] } },
        { field: 'isLocked', title: '是否锁定', type: 'bool', width: 110, align: 'left' , bind: { key: "IsLocked", data: [] } },
        { field: 'locationDesc', title: '货位描述', type: 'string', width: 110, align: 'left' },
        { field: 'isLocked', title: '是否锁定', type: 'bool', width: 110, align: 'left', hidden: true, bind: { key: "IsLocked", data: [] } },
        { field: 'locationDesc', title: '货位描述', type: 'string', width: 110, align: 'left', hidden: true },
        { field: 'remark', title: '备注', type: 'string', width: 110, align: 'left' },
        { field: 'wareAreaCode', title: '库区编号', type: 'string', width: 110, align: 'left', hidden: true },
        { field: 'roadway', title: '巷道', type: 'string', width: 110, align: 'left', hidden: true },
Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/basicinfo/LocationStatusChange.vue
@@ -31,7 +31,7 @@
                { "title": "货位编号", "field": "locationCode", type: "text" },
                { "title": "变动前货位状态", "field": "BeforeStatus", "type": "select", dataKey: "LocationState", data: [] },
                { "title": "变动后货位状态", "field": "AfterStatus", "type": "select", dataKey: "LocationState", data: [] },
                { "title": "变动类型", "field": "changeType", type: "text" },
                { "title": "变动类型", "field": "changeType", type: "select", dataKey: "StatusChangeType", data: []  },
            ]
        ]);
        const columns = ref([{ field: 'Id', title: '主键', type: 'int', width: 110, hidden: true, readonly: true, require: true, align: 'left' },
@@ -39,7 +39,7 @@
        { field: 'locationCode', title: '货位编号', type: 'string', width: 110, require: true, align: 'left' },
        { field: 'beforeStatus', title: '变动前货位状态', type: 'int', width: 120, align: 'left', bind: { key: "LocationState", data: [] } },
        { field: 'afterStatus', title: '变动后货位状态', type: 'int', width: 110, require: true, align: 'left', sort: true, bind: { key: "LocationState", data: [] } },
        { field: 'changeType', title: '变动类型(出库、入库、手动调整...)', type: 'string', width: 70, align: 'left' },
        { field: 'changeType', title: '变动类型(出库、入库、手动调整...)', type: 'string', width: 70, align: 'left', bind: { key: "StatusChangeType", data: [] }  },
        { field: 'orderId', title: '单据主键', type: 'string', width: 70, align: 'left' },
        { field: 'orderNo', title: '单据编号', type: 'string', width: 110, align: 'left' },
        { field: 'orderDetailId', title: '单据明细主键', type: 'string', width: 110, align: 'left' },
Code Management/WMS/WIDESEA_WMSServer/WIDESEA_Common/StatusChangeType/StatusChangeTypeEnum.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,25 @@
using System.ComponentModel;
namespace WIDESEA_Common
{
    public enum StatusChangeTypeEnum
    {
        /// <summary>
        /// è‡ªåŠ¨å…¥åº“
        /// </summary>
        [Description("自动入库")]
        AutomaticStorage = 1,
        /// <summary>
        /// è‡ªåŠ¨å‡ºåº“
        /// </summary>
        [Description("自动出库")]
        AutomaticDelivery = 2,
        /// <summary>
        /// äººå·¥æ“ä½œ
        /// </summary>
        [Description("人工操作")]
        ManualOperation = 3
    }
}
Code Management/WMS/WIDESEA_WMSServer/WIDESEA_Core/Utilities/EntityProperties.cs
@@ -58,7 +58,6 @@
            }
            else if (dbType == SqlDbTypeName.Float || dbType == SqlDbTypeName.Decimal || dbType == SqlDbTypeName.Double)
            {
                if (!val.IsNumber(null))
                {
                    reslutMsg = "不是有效数字";
@@ -78,7 +77,6 @@
                || dbType == SqlDbTypeName.Char
                || dbType == SqlDbTypeName.Text))
            {
                //默认nvarchar(max) ã€text é•¿åº¦ä¸èƒ½è¶…过20000
                if (val.Length > 200000)
                {
@@ -86,7 +84,6 @@
                }
                else
                {
                    int length = sugarColumn.Length;
                    if (length == 0) { return (true, null, null); }
                    //判断双字节与单字段
@@ -118,6 +115,7 @@
            {  typeof(byte),SqlDbTypeName.Int },//类型待完
            { typeof(Guid),SqlDbTypeName.UniqueIdentifier}
        };
        public static string GetProperWithDbType(this PropertyInfo propertyInfo)
        {
            bool result = ProperWithDbType.TryGetValue(propertyInfo.PropertyType, out string value);
@@ -189,7 +187,7 @@
                    }
                    continue;
                }
                string str = dic[property.Name.FirstLetterToLower()].ToString();
                string str = dic.GetValueOrDefault(property.Name.FirstLetterToLower(), "").ToString();
                //将所有空值设置为null
                if (dic[property.Name.FirstLetterToLower()] != null && str == string.Empty)
                    dic[property.Name.FirstLetterToLower()] = null;
@@ -197,6 +195,22 @@
            return string.Empty;
        }
        /// <summary>
        /// å®‰å…¨èŽ·å–å­—å…¸å€¼ï¼Œå¦‚æžœé”®ä¸å­˜åœ¨æˆ–å€¼ä¸ºnull则返回默认值
        /// </summary>
        /// <typeparam name="TKey">字典键的类型</typeparam>
        /// <typeparam name="TValue">字典值的类型</typeparam>
        /// <param name="dictionary">字典实例</param>
        /// <param name="key">键</param>
        /// <param name="defaultValue">默认值</param>
        /// <returns>字典值或默认值</returns>
        public static TValue GetValueOrDefault<TKey, TValue>(this IDictionary<TKey, TValue> dictionary, TKey key, TValue defaultValue = default)
        {
            if (dictionary == null) throw new ArgumentNullException(nameof(dictionary));
            return dictionary.TryGetValue(key, out TValue value) && value != null ? value : defaultValue;
        }
        public static string GetKeyName(this Type typeinfo)
        {
            return typeinfo.GetProperties().GetKeyName();
Code Management/WMS/WIDESEA_WMSServer/WIDESEA_DTO/Location/LocationChangeRecordDto.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,35 @@
namespace WIDESEA_DTO
{
    public class LocationChangeRecordDto
    {
        /// <summary>
        /// è´§ä½ç¼–码
        /// </summary>
        public string LocationCode { get; set; }
        /// <summary>
        /// è´§ä½ID
        /// </summary>
        public int LocationId { get; set; }
        /// <summary>
        /// å˜æ›´å‰çŠ¶æ€
        /// </summary>
        public int BeforeStatus { get; set; }
        /// <summary>
        /// å˜æ›´åŽçŠ¶æ€
        /// </summary>
        public int AfterStatus { get; set; }
        /// <summary>
        /// å˜æ›´ç±»åž‹
        /// </summary>
        public int ChangeType { get; set; }
        /// <summary>
        /// è´§ä½ç¼–码
        /// </summary>
        public int TaskNum { get; set; } = 0;
    }
}
Code Management/WMS/WIDESEA_WMSServer/WIDESEA_IStorageBasicRepository/Location/ILocationStatusChangeRecordRepository.cs
@@ -1,5 +1,13 @@
namespace WIDESEA_IStorageBasicRepository;
using WIDESEA_DTO;
namespace WIDESEA_IStorageBasicRepository;
public interface ILocationStatusChangeRecordRepository : IRepository<DtLocationStatusChangeRecord>
{
    /// <summary>
    /// æ·»åŠ è´§ä½å˜åŠ¨è®°å½•
    /// </summary>
    /// <param name="changeRecordDto">数据模型</param>
    /// <returns></returns>
    bool AddStatusChangeRecord(LocationChangeRecordDto changeRecordDto);
}
Code Management/WMS/WIDESEA_WMSServer/WIDESEA_IStorageTaskRepository/Task/ITaskExecuteDetailRepository.cs
@@ -2,5 +2,12 @@
public interface ITaskExecuteDetailRepository : IRepository<Dt_TaskExecuteDetail>
{
    /// <summary>
    /// æ·»åŠ ä»»åŠ¡æ˜Žç»†
    /// </summary>
    /// <param name="dt_Task">任务数据</param>
    /// <param name="isManual">是否人工操作</param>
    /// <param name="message">执行信息</param>
    /// <returns></returns>
    Task<bool> AddDetailAsync(Dt_Task dt_Task, bool isManual, string message);
}
Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StorageBasicRepository/Location/LocationStatusChangeRecordRepository.cs
@@ -1,9 +1,31 @@
namespace WIDESEA_StorageBasicRepository
using WIDESEA_DTO;
namespace WIDESEA_StorageBasicRepository
{
    public class LocationStatusChangeRecordRepository : RepositoryBase<DtLocationStatusChangeRecord>, ILocationStatusChangeRecordRepository
    {
        public LocationStatusChangeRecordRepository(IUnitOfWorkManage unitOfWorkManage) : base(unitOfWorkManage)
        {
        }
        /// <summary>
        /// æ·»åŠ è´§ä½å˜åŠ¨è®°å½•
        /// </summary>
        /// <param name="changeRecordDto">数据模型</param>
        /// <returns></returns>
        public bool AddStatusChangeRecord(LocationChangeRecordDto changeRecordDto)
        {
            DtLocationStatusChangeRecord dtLocationStatusChangeRecord = new DtLocationStatusChangeRecord()
            {
                ChangeType = changeRecordDto.ChangeType,
                LocationCode = changeRecordDto.LocationCode,
                LocationId = changeRecordDto.LocationId,
                Creater = "System",
                TaskNum = changeRecordDto.TaskNum,
                AfterStatus = changeRecordDto.AfterStatus,
                BeforeStatus = changeRecordDto.BeforeStatus,
            };
            return AddData(dtLocationStatusChangeRecord) > 0;
        }
    }
}
Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StorageBasicServices/Location/LocationInfoService.cs
@@ -1,4 +1,5 @@
using WIDESEA_DTO;
using WIDESEA_Common;
using WIDESEA_DTO;
namespace WIDESEA_StorageBasicService;
@@ -82,7 +83,26 @@
        }
    }
    public override WebResponseContent UpdateData(SaveModel saveModel)
    {
        int id = saveModel.MainData["id"].ObjToInt();
        int status = saveModel.MainData["locationStatus"].ObjToInt();
        var location = BaseDal.QueryFirst(x => x.Id == id);
    
        LocationChangeRecordDto changeRecordDto = new LocationChangeRecordDto()
        {
            AfterStatus = status,
            BeforeStatus = location.LocationStatus,
            TaskNum = 0,
            LocationId = id,
            LocationCode = location.LocationCode,
            ChangeType = (int)StatusChangeTypeEnum.ManualOperation
        };
        _locationStatusChangeRecordRepository.AddStatusChangeRecord(changeRecordDto);
        return base.UpdateData(saveModel);
    }
    #region åˆ›å»ºåŽŸå§‹è´§ä½æ•°æ®
@@ -304,8 +324,6 @@
    }
    #endregion åˆ›å»ºåˆå§‹è´§ä½æ–¹æ³•
    #endregion å†…部方法
}
Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StorageTaskRepository/Task/TaskExecuteDetailRepository.cs
@@ -6,6 +6,13 @@
    {
    }
    /// <summary>
    /// æ·»åŠ ä»»åŠ¡æ˜Žç»†
    /// </summary>
    /// <param name="dt_Task">任务数据</param>
    /// <param name="isManual">是否人工操作</param>
    /// <param name="message">执行信息</param>
    /// <returns></returns>
    public async Task<bool> AddDetailAsync(Dt_Task dt_Task,bool isManual,string message)
    {
        Dt_TaskExecuteDetail dt_TaskExecuteDetail = new Dt_TaskExecuteDetail()
Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StorageTaskServices/Task/Dt_TaskService.cs
@@ -250,6 +250,7 @@
            if (task != null)
            {
                // æ›´æ–°çŽ°æœ‰ä»»åŠ¡
                content = await UpdateExistingTask(input, areaInfo.AreaID, task);
            }
@@ -665,6 +666,7 @@
        int taskState;
        string original = task.CurrentAddress;
        DtLocationInfo location = new DtLocationInfo();
        int beforeStatus = 0;
        if (input.Type == (int)TaskTypeEnum.Outbound)
        {
@@ -678,6 +680,7 @@
            location = await GetLocationDistributeAsync(areaId, task.Roadway);
            toAddress = location.LocationCode;
            taskState = (int)InTaskStatusEnum.Line_InFinish;
            beforeStatus = location.LocationStatus;
            // æ›´æ–°è´§ä½ä¿¡æ¯
            location.LocationStatus = (int)LocationEnum.Lock;
@@ -693,24 +696,25 @@
        _unitOfWorkManage.BeginTran();
        bool isUpdateLo = true;
        bool isUpdateChange = true;
        // å°è¯•更新任务
        bool isResult = await BaseDal.UpdateDataAsync(task);
        bool isTaskDetail = await _taskExecuteDetailRepository.AddDetailAsync(task, true, TaskDescription.GetTaskUpdateDescription(task.PalletCode, original, input.Position, InTaskStatusEnum.Line_InFinish.GetIntegralRuleTypeEnumDesc()));
        bool isTaskDetail = await _taskExecuteDetailRepository.AddDetailAsync(task, false, TaskDescription.GetTaskUpdateDescription(task.PalletCode, original, input.Position, InTaskStatusEnum.Line_InFinish.GetIntegralRuleTypeEnumDesc()));
        if (input.Type != (int)TaskTypeEnum.Outbound)
        {
            DtLocationStatusChangeRecord dtLocationStatusChangeRecord = new DtLocationStatusChangeRecord()
            LocationChangeRecordDto changeRecordDto = new LocationChangeRecordDto()
            {
                ChangeType = task.TaskType,
                LocationCode = location.LocationCode,
                LocationId = location.Id,
                Creater = "System",
                TaskNum = task.TaskNum,
                AfterStatus = location.LocationStatus,
                BeforeStatus = (int)LocationEnum.Free,
                BeforeStatus = beforeStatus,
                TaskNum = task.TaskNum.Value,
                LocationId = location.Id,
                LocationCode = location.LocationCode,
                ChangeType = (int)StatusChangeTypeEnum.AutomaticStorage,
            };
            isUpdateChange = await _locationStatusChangeRecordRepository.AddDataAsync(dtLocationStatusChangeRecord) > 0;
            isUpdateChange = _locationStatusChangeRecordRepository.AddStatusChangeRecord(changeRecordDto);
            isUpdateLo = await _locationRepository.UpdateDataAsync(location);
        }
        if (isResult && isUpdateLo && isTaskDetail)
        {
            _unitOfWorkManage.CommitTran();