Commit a571fb027fa3d875deb25c8bc39f1ba1bcb208d7

Authored by “wangming”
1 parent 5ca571fe

更新门店归属管理功能,删除不再使用的LqMdMdgs相关服务、DTO和实体类,优化LqMdxx服务以支持新字段,调整前端表单以适应新结构,确保代码整洁和功能完整性。

Showing 21 changed files with 1424 additions and 841 deletions
antis-ncc-admin/src/views/lqMdMdgs/index.vue
1 1 <template>
2 2 <div class="NCC-common-layout">
3 3 <div class="NCC-common-layout-center">
  4 + <!-- 搜索区域 -->
4 5 <el-row class="NCC-common-search-box" :gutter="16">
5 6 <el-form @submit.native.prevent>
6   - <el-col :span="6">
  7 + <el-col :span="5">
7 8 <el-form-item label="门店编码">
8   - <el-input v-model="query.id" placeholder="门店编码" clearable />
  9 + <el-input
  10 + v-model="query.mdbm"
  11 + placeholder="请输入门店编码"
  12 + clearable
  13 + prefix-icon="el-icon-search"
  14 + style="border-radius: 6px;"
  15 + />
9 16 </el-form-item>
10 17 </el-col>
11   - <el-col :span="6">
12   - <el-form-item label="单据门店编号">
13   - <el-input v-model="query.djmdbh" placeholder="单据门店编号" clearable />
  18 + <el-col :span="5">
  19 + <el-form-item label="门店名称">
  20 + <el-input
  21 + v-model="query.dm"
  22 + placeholder="请输入门店名称"
  23 + clearable
  24 + prefix-icon="el-icon-search"
  25 + style="border-radius: 6px;"
  26 + />
14 27 </el-form-item>
15 28 </el-col>
16   - <el-col :span="6">
  29 + <el-col :span="5">
17 30 <el-form-item label="单据门店">
18   - <el-input v-model="query.djmd" placeholder="单据门店" clearable />
19   - </el-form-item>
20   - </el-col>
21   - <template v-if="showAll">
22   - <el-col :span="6">
23   - <el-form-item label="事业部">
24   - <el-select v-model="query.syb" placeholder="事业部" clearable >
25   - <el-option v-for="(item, index) in sybOptions" :key="index" :label="item.fullName" :value="item.id" />
26   - </el-select>
27   - </el-form-item>
28   - </el-col>
29   - <el-col :span="6">
30   - <el-form-item label="教育部">
31   - <el-select v-model="query.jyb" placeholder="教育部" clearable >
32   - <el-option v-for="(item, index) in jybOptions" :key="index" :label="item.fullName" :value="item.id" />
33   - </el-select>
34   - </el-form-item>
35   - </el-col>
36   - <el-col :span="6">
37   - <el-form-item label="科技部">
38   - <el-select v-model="query.kjb" placeholder="科技部" clearable >
39   - <el-option v-for="(item, index) in kjbOptions" :key="index" :label="item.fullName" :value="item.id" />
40   - </el-select>
41   - </el-form-item>
42   - </el-col>
43   - <el-col :span="6">
44   - <el-form-item label="大项目部">
45   - <el-select v-model="query.dxmb" placeholder="大项目部" clearable >
46   - <el-option v-for="(item, index) in dxmbOptions" :key="index" :label="item.fullName" :value="item.id" />
47   - </el-select>
48   - </el-form-item>
49   - </el-col>
50   - <el-col :span="6">
51   - <el-form-item label="归属起始时间">
52   - <el-date-picker v-model="query.gsqssj" type="daterange" value-format="timestamp" format="yyyy-MM-dd" start-placeholder="开始日期" end-placeholder="结束日期">
53   - </el-date-picker>
54   - </el-form-item>
55   - </el-col>
56   - <el-col :span="6">
57   - <el-form-item label="归属终止时间">
58   - <el-date-picker v-model="query.gszzsj" type="daterange" value-format="timestamp" format="yyyy-MM-dd" start-placeholder="开始日期" end-placeholder="结束日期">
59   - </el-date-picker>
  31 + <el-input
  32 + v-model="query.djmd"
  33 + placeholder="请输入单据门店"
  34 + clearable
  35 + prefix-icon="el-icon-search"
  36 + style="border-radius: 6px;"
  37 + />
60 38 </el-form-item>
61 39 </el-col>
62   - <el-col :span="6">
63   - <el-form-item label="修改信息">
64   - <el-input v-model="query.xgxx" placeholder="修改信息" />
65   - </el-form-item>
66   - </el-col>
67   - <el-col :span="6">
68   - <el-form-item label="门店名称">
69   - <el-select v-model="query.mdmc" placeholder="门店名称" clearable >
70   - <el-option v-for="(item, index) in mdmcOptions" :key="index" :label="item.fullName" :value="item.id" />
  40 + <el-col :span="5">
  41 + <el-form-item label="新店状态">
  42 + <el-select
  43 + v-model="query.isNewStore"
  44 + placeholder="请选择新店状态"
  45 + clearable
  46 + style="width: 100%; border-radius: 6px;"
  47 + >
  48 + <el-option label="新店" :value="true" />
  49 + <el-option label="老店" :value="false" />
71 50 </el-select>
72 51 </el-form-item>
73 52 </el-col>
74   - </template>
75   - <el-col :span="6">
  53 + <el-col :span="4">
76 54 <el-form-item>
77   - <el-button type="primary" icon="el-icon-search" @click="search()">查询</el-button>
78   - <el-button icon="el-icon-refresh-right" @click="reset()">重置</el-button>
79   - <el-button type="text" icon="el-icon-arrow-down" @click="showAll=true" v-if="!showAll">展开</el-button>
80   - <el-button type="text" icon="el-icon-arrow-up" @click="showAll=false" v-else>收起</el-button>
  55 + <div class="search-buttons" style="height: 32px;">
  56 + <el-button type="primary" icon="el-icon-search" @click="search()">查询</el-button>
  57 + <el-button icon="el-icon-refresh-right" @click="reset()">重置</el-button>
  58 + </div>
81 59 </el-form-item>
82 60 </el-col>
83 61 </el-form>
84 62 </el-row>
85 63 <div class="NCC-common-layout-main NCC-flex-main">
86 64 <div class="NCC-common-head">
87   - <div>
88   - <el-button type="primary" icon="el-icon-plus" @click="addOrUpdateHandle()">新增</el-button>
89   - <el-button type="text" icon="el-icon-download" @click="exportData()">导出</el-button>
90   - <el-button type="text" icon="el-icon-delete" @click="handleBatchRemoveDel()">批量删除</el-button>
  65 + <div class="NCC-common-head-left">
  66 + <h3 class="NCC-common-head-title">
  67 + <i class="el-icon-office-building"></i>
  68 + 门店归属管理
  69 + </h3>
  70 + <span class="NCC-common-head-subtitle">共 {{ total }} 条记录</span>
91 71 </div>
92 72 <div class="NCC-common-head-right">
  73 + <el-button
  74 + type="success"
  75 + icon="el-icon-edit"
  76 + :disabled="multipleSelection.length === 0"
  77 + @click="batchEditHandle"
  78 + >
  79 + 批量编辑 ({{ multipleSelection.length }})
  80 + </el-button>
  81 + <el-button
  82 + type="warning"
  83 + icon="el-icon-download"
  84 + @click="exportData"
  85 + >
  86 + 导出数据
  87 + </el-button>
93 88 <el-tooltip effect="dark" content="刷新" placement="top">
94 89 <el-link icon="icon-ym icon-ym-Refresh NCC-common-head-icon" :underline="false" @click="reset()" />
95 90 </el-tooltip>
96 91 <screenfull isContainer />
97 92 </div>
98 93 </div>
99   - <NCC-table v-loading="listLoading" :data="list" has-c @selection-change="handleSelectionChange">
100   - <el-table-column prop="id" label="门店编码" align="left" />
101   - <el-table-column prop="djmdbh" label="单据门店编号" align="left" />
102   - <el-table-column prop="djmd" label="单据门店" align="left" />
103   - <el-table-column label="事业部" prop="syb" align="left">
104   - <template slot-scope="scope">{{ scope.row.syb | dynamicText(sybOptions) }}</template>
  94 + <NCC-table
  95 + v-loading="listLoading"
  96 + :data="list"
  97 + @selection-change="handleSelectionChange"
  98 + :row-key="row => row.id"
  99 + >
  100 + <el-table-column type="selection" width="55" align="center" />
  101 + <el-table-column prop="mdbm" label="门店编码" align="left" width="120" show-overflow-tooltip>
  102 + <template slot-scope="scope">
  103 + <el-tag size="small" type="primary">{{ scope.row.mdbm }}</el-tag>
  104 + </template>
105 105 </el-table-column>
106   - <el-table-column label="教育部" prop="jyb" align="left">
107   - <template slot-scope="scope">{{ scope.row.jyb | dynamicText(jybOptions) }}</template>
  106 + <el-table-column prop="dm" label="门店名称" align="left" min-width="150" show-overflow-tooltip>
  107 + <template slot-scope="scope">
  108 + <span class="store-name">{{ scope.row.dm }}</span>
  109 + </template>
108 110 </el-table-column>
109   - <el-table-column label="科技部" prop="kjb" align="left">
110   - <template slot-scope="scope">{{ scope.row.kjb | dynamicText(kjbOptions) }}</template>
  111 + <el-table-column prop="djmd" label="单据门店" align="left" width="150" show-overflow-tooltip />
  112 + <el-table-column label="事业部" prop="syb" align="left" width="120">
  113 + <template slot-scope="scope">
  114 + <el-tag v-if="scope.row.syb" size="small" type="success">
  115 + {{ getDepartmentName(scope.row.syb, sybOptions) }}
  116 + </el-tag>
  117 + <span v-else class="empty-text">无</span>
  118 + </template>
  119 + </el-table-column>
  120 + <el-table-column label="教育部" prop="jyb" align="left" width="120">
  121 + <template slot-scope="scope">
  122 + <el-tag v-if="scope.row.jyb" size="small" type="warning">
  123 + {{ getDepartmentName(scope.row.jyb, jybOptions) }}
  124 + </el-tag>
  125 + <span v-else class="empty-text">无</span>
  126 + </template>
111 127 </el-table-column>
112   - <el-table-column label="大项目部" prop="dxmb" align="left">
113   - <template slot-scope="scope">{{ scope.row.dxmb | dynamicText(dxmbOptions) }}</template>
  128 + <el-table-column label="科技部" prop="kjb" align="left" width="120">
  129 + <template slot-scope="scope">
  130 + <el-tag v-if="scope.row.kjb" size="small" type="info">
  131 + {{ getDepartmentName(scope.row.kjb, kjbOptions) }}
  132 + </el-tag>
  133 + <span v-else class="empty-text">无</span>
  134 + </template>
114 135 </el-table-column>
115   - <el-table-column prop="gsqssj" label="归属起始时间" align="left" />
116   - <el-table-column prop="gszzsj" label="归属终止时间" align="left" />
117   - <el-table-column prop="xgxx" label="修改信息" align="left" />
118   - <el-table-column label="门店名称" prop="mdmc" align="left">
119   - <template slot-scope="scope">{{ scope.row.mdmc | dynamicText(mdmcOptions) }}</template>
  136 + <el-table-column label="大项目部" prop="dxmb" align="left" width="120">
  137 + <template slot-scope="scope">
  138 + <el-tag v-if="scope.row.dxmb" size="small" type="danger">
  139 + {{ getDepartmentName(scope.row.dxmb, dxmbOptions) }}
  140 + </el-tag>
  141 + <span v-else class="empty-text">无</span>
  142 + </template>
120 143 </el-table-column>
121   - <el-table-column label="操作" fixed="right" width="100">
122   - <template slot-scope="scope">
123   - <el-button type="text" @click="addOrUpdateHandle(scope.row.id)" >编辑</el-button>
124   - <el-button type="text" @click="handleDel(scope.row.id)" class="NCC-table-delBtn" >删除</el-button>
  144 + <el-table-column label="新店状态" align="center" width="100">
  145 + <template slot-scope="scope">
  146 + <el-tag v-if="scope.row.isNewStore" type="success" size="small">
  147 + <i class="el-icon-star-on"></i> 新店
  148 + </el-tag>
  149 + <el-tag v-else type="info" size="small">
  150 + <i class="el-icon-star-off"></i> 老店
  151 + </el-tag>
  152 + </template>
  153 + </el-table-column>
  154 + <el-table-column label="操作" fixed="right" width="120" align="center">
  155 + <template slot-scope="scope">
  156 + <el-button
  157 + type="text"
  158 + icon="el-icon-edit"
  159 + @click="editHandle(scope.row)"
  160 + class="action-btn"
  161 + >
  162 + 编辑
  163 + </el-button>
  164 + <el-button
  165 + type="text"
  166 + icon="el-icon-view"
  167 + @click="viewHandle(scope.row)"
  168 + class="action-btn"
  169 + >
  170 + 查看
  171 + </el-button>
125 172 </template>
126 173 </el-table-column>
127 174 </NCC-table>
128 175 <pagination :total="total" :page.sync="listQuery.currentPage" :limit.sync="listQuery.pageSize" @pagination="initData" />
129 176 </div>
130 177 </div>
131   - <NCC-Form v-if="formVisible" ref="NCCForm" @refresh="refresh" />
  178 + <!-- 编辑弹窗 -->
  179 + <el-dialog
  180 + :title="dialogTitle"
  181 + :visible.sync="dialogVisible"
  182 + width="700px"
  183 + :close-on-click-modal="false"
  184 + :before-close="handleClose"
  185 + class="store-dialog"
  186 + >
  187 + <div class="dialog-header">
  188 + <div class="store-info">
  189 + <i class="el-icon-office-building"></i>
  190 + <span class="store-name">{{ editForm.dm }}</span>
  191 + <el-tag size="small" type="primary">{{ editForm.mdbm }}</el-tag>
  192 + </div>
  193 + </div>
  194 + <el-form :model="editForm" :rules="editRules" ref="editForm" label-width="120px" class="edit-form">
  195 + <el-row :gutter="20">
  196 + <el-col :span="12">
  197 + <el-form-item label="事业部" prop="syb">
  198 + <el-select
  199 + v-model="editForm.syb"
  200 + placeholder="请选择事业部"
  201 + clearable
  202 + style="width: 100%;"
  203 + filterable
  204 + >
  205 + <el-option
  206 + v-for="item in sybOptions"
  207 + :key="item.Id"
  208 + :label="item.FullName"
  209 + :value="item.Id"
  210 + >
  211 + <span style="float: left">{{ item.FullName }}</span>
  212 + <span style="float: right; color: #8492a6; font-size: 13px">{{ item.EnCode }}</span>
  213 + </el-option>
  214 + </el-select>
  215 + </el-form-item>
  216 + </el-col>
  217 + <el-col :span="12">
  218 + <el-form-item label="教育部" prop="jyb">
  219 + <el-select
  220 + v-model="editForm.jyb"
  221 + placeholder="请选择教育部"
  222 + clearable
  223 + style="width: 100%;"
  224 + filterable
  225 + >
  226 + <el-option
  227 + v-for="item in jybOptions"
  228 + :key="item.Id"
  229 + :label="item.FullName"
  230 + :value="item.Id"
  231 + >
  232 + <span style="float: left">{{ item.FullName }}</span>
  233 + <span style="float: right; color: #8492a6; font-size: 13px">{{ item.EnCode }}</span>
  234 + </el-option>
  235 + </el-select>
  236 + </el-form-item>
  237 + </el-col>
  238 + </el-row>
  239 + <el-row :gutter="20">
  240 + <el-col :span="12">
  241 + <el-form-item label="科技部" prop="kjb">
  242 + <el-select
  243 + v-model="editForm.kjb"
  244 + placeholder="请选择科技部"
  245 + clearable
  246 + style="width: 100%;"
  247 + filterable
  248 + >
  249 + <el-option
  250 + v-for="item in kjbOptions"
  251 + :key="item.Id"
  252 + :label="item.FullName"
  253 + :value="item.Id"
  254 + >
  255 + <span style="float: left">{{ item.FullName }}</span>
  256 + <span style="float: right; color: #8492a6; font-size: 13px">{{ item.EnCode }}</span>
  257 + </el-option>
  258 + </el-select>
  259 + </el-form-item>
  260 + </el-col>
  261 + <el-col :span="12">
  262 + <el-form-item label="大项目部" prop="dxmb">
  263 + <el-select
  264 + v-model="editForm.dxmb"
  265 + placeholder="请选择大项目部"
  266 + clearable
  267 + style="width: 100%;"
  268 + filterable
  269 + >
  270 + <el-option
  271 + v-for="item in dxmbOptions"
  272 + :key="item.Id"
  273 + :label="item.FullName"
  274 + :value="item.Id"
  275 + >
  276 + <span style="float: left">{{ item.FullName }}</span>
  277 + <span style="float: right; color: #8492a6; font-size: 13px">{{ item.EnCode }}</span>
  278 + </el-option>
  279 + </el-select>
  280 + </el-form-item>
  281 + </el-col>
  282 + </el-row>
  283 + </el-form>
  284 + <div slot="footer" class="dialog-footer">
  285 + <el-button @click="handleClose" :disabled="saveLoading">取消</el-button>
  286 + <el-button type="primary" @click="saveEdit" :loading="saveLoading">
  287 + <i class="el-icon-check"></i> 保存
  288 + </el-button>
  289 + </div>
  290 + </el-dialog>
  291 +
  292 + <!-- 批量编辑弹窗 -->
  293 + <el-dialog
  294 + title="批量编辑门店归属"
  295 + :visible.sync="batchDialogVisible"
  296 + width="600px"
  297 + :close-on-click-modal="false"
  298 + >
  299 + <div class="batch-edit-header">
  300 + <i class="el-icon-warning"></i>
  301 + <span>已选择 {{ multipleSelection.length }} 个门店进行批量编辑</span>
  302 + </div>
  303 + <el-form :model="batchForm" :rules="batchRules" ref="batchForm" label-width="120px">
  304 + <el-form-item label="事业部" prop="syb">
  305 + <el-select v-model="batchForm.syb" placeholder="请选择事业部" clearable style="width: 100%;">
  306 + <el-option v-for="item in sybOptions" :key="item.Id" :label="item.FullName" :value="item.Id" />
  307 + </el-select>
  308 + </el-form-item>
  309 + <el-form-item label="教育部" prop="jyb">
  310 + <el-select v-model="batchForm.jyb" placeholder="请选择教育部" clearable style="width: 100%;">
  311 + <el-option v-for="item in jybOptions" :key="item.Id" :label="item.FullName" :value="item.Id" />
  312 + </el-select>
  313 + </el-form-item>
  314 + <el-form-item label="科技部" prop="kjb">
  315 + <el-select v-model="batchForm.kjb" placeholder="请选择科技部" clearable style="width: 100%;">
  316 + <el-option v-for="item in kjbOptions" :key="item.Id" :label="item.FullName" :value="item.Id" />
  317 + </el-select>
  318 + </el-form-item>
  319 + <el-form-item label="大项目部" prop="dxmb">
  320 + <el-select v-model="batchForm.dxmb" placeholder="请选择大项目部" clearable style="width: 100%;">
  321 + <el-option v-for="item in dxmbOptions" :key="item.Id" :label="item.FullName" :value="item.Id" />
  322 + </el-select>
  323 + </el-form-item>
  324 + </el-form>
  325 + <div slot="footer" class="dialog-footer">
  326 + <el-button @click="batchDialogVisible = false">取消</el-button>
  327 + <el-button type="primary" @click="saveBatchEdit" :loading="batchSaveLoading">
  328 + <i class="el-icon-check"></i> 批量保存
  329 + </el-button>
  330 + </div>
  331 + </el-dialog>
132 332 <ExportBox v-if="exportBoxVisible" ref="ExportBox" @download="download" />
133 333 </div>
134 334 </template>
135 335 <script>
136 336 import request from '@/utils/request'
137   - import { getDictionaryDataSelector } from '@/api/systemData/dictionary'
138   - import NCCForm from './Form'
139 337 import ExportBox from './ExportBox'
140   - import { previewDataInterface } from '@/api/systemData/dataInterface'
141 338 export default {
142   - components: { NCCForm, ExportBox },
  339 + components: { ExportBox },
143 340 data() {
144 341 return {
145   - showAll: false,
146 342 query: {
147   - id:undefined,
148   - djmdbh:undefined,
149   - djmd:undefined,
150   - syb:undefined,
151   - jyb:undefined,
152   - kjb:undefined,
153   - dxmb:undefined,
154   - gsqssj:undefined,
155   - gszzsj:undefined,
156   - xgxx:undefined,
157   - mdmc:undefined,
  343 + mdbm: undefined,
  344 + dm: undefined,
  345 + djmd: undefined,
  346 + isNewStore: undefined
158 347 },
159 348 list: [],
160 349 listLoading: true,
161   - multipleSelection: [], total: 0,
  350 + total: 0,
162 351 listQuery: {
163 352 currentPage: 1,
164 353 pageSize: 20,
165 354 sort: "desc",
166 355 sidx: "",
167 356 },
168   - formVisible: false,
169 357 exportBoxVisible: false,
  358 + dialogVisible: false,
  359 + batchDialogVisible: false,
  360 + saveLoading: false,
  361 + batchSaveLoading: false,
  362 + multipleSelection: [],
  363 + dialogTitle: '编辑门店归属',
  364 + editForm: {
  365 + id: '',
  366 + mdbm: '',
  367 + dm: '',
  368 + syb: '',
  369 + jyb: '',
  370 + kjb: '',
  371 + dxmb: ''
  372 + },
  373 + batchForm: {
  374 + syb: '',
  375 + jyb: '',
  376 + kjb: '',
  377 + dxmb: ''
  378 + },
  379 + editRules: {
  380 + syb: [{ required: false, message: '请选择事业部', trigger: 'change' }],
  381 + jyb: [{ required: false, message: '请选择教育部', trigger: 'change' }],
  382 + kjb: [{ required: false, message: '请选择科技部', trigger: 'change' }],
  383 + dxmb: [{ required: false, message: '请选择大项目部', trigger: 'change' }]
  384 + },
  385 + batchRules: {
  386 + syb: [{ required: false, message: '请选择事业部', trigger: 'change' }],
  387 + jyb: [{ required: false, message: '请选择教育部', trigger: 'change' }],
  388 + kjb: [{ required: false, message: '请选择科技部', trigger: 'change' }],
  389 + dxmb: [{ required: false, message: '请选择大项目部', trigger: 'change' }]
  390 + },
170 391 columnList: [
171   - { prop: 'id', label: '门店编码' },
172   - { prop: 'djmdbh', label: '单据门店编号' },
  392 + { prop: 'mdbm', label: '门店编码' },
  393 + { prop: 'dm', label: '门店名称' },
173 394 { prop: 'djmd', label: '单据门店' },
174 395 { prop: 'syb', label: '事业部' },
175 396 { prop: 'jyb', label: '教育部' },
176 397 { prop: 'kjb', label: '科技部' },
177 398 { prop: 'dxmb', label: '大项目部' },
178   - { prop: 'gsqssj', label: '归属起始时间' },
179   - { prop: 'gszzsj', label: '归属终止时间' },
180   - { prop: 'xgxx', label: '修改信息' },
181   - { prop: 'mdmc', label: '门店名称' },
  399 + { prop: 'isNewStore', label: '是否新店' }
182 400 ],
183   - mdmcOptions : [],
184   - sybOptions : [],
185   - jybOptions : [],
186   - kjbOptions : [],
187   - dxmbOptions : [],
  401 + sybOptions: [],
  402 + jybOptions: [],
  403 + kjbOptions: [],
  404 + dxmbOptions: [],
188 405 }
189 406 },
190 407 computed: {},
191 408 created() {
192 409 this.initData()
193   - this.getmdmcOptions();
194   - this.getsybOptions();
195   - this.getjybOptions();
196   - this.getkjbOptions();
197   - this.getdxmbOptions();
  410 + this.loadDepartmentOptions()
198 411 },
199 412 methods: {
200   - getmdmcOptions(){
201   - previewDataInterface('730960205902251269').then(res => {
202   - this.mdmcOptions = res.data
203   - });
  413 + // 加载部门选项
  414 + loadDepartmentOptions() {
  415 + // 加载事业部
  416 + request({
  417 + url: '/api/Extend/Organize/GetByName',
  418 + method: 'GET',
  419 + data: { organizeName: '事业部' }
  420 + }).then(res => {
  421 + this.sybOptions = res.data || []
  422 + }).catch(() => {
  423 + this.sybOptions = []
  424 + })
  425 +
  426 + // 加载教育部
  427 + request({
  428 + url: '/api/Extend/Organize/GetByName',
  429 + method: 'GET',
  430 + data: { organizeName: '教育部' }
  431 + }).then(res => {
  432 + this.jybOptions = res.data || []
  433 + }).catch(() => {
  434 + this.jybOptions = []
  435 + })
  436 +
  437 + // 加载科技部
  438 + request({
  439 + url: '/api/Extend/Organize/GetByName',
  440 + method: 'GET',
  441 + data: { organizeName: '科技部' }
  442 + }).then(res => {
  443 + this.kjbOptions = res.data || []
  444 + }).catch(() => {
  445 + this.kjbOptions = []
  446 + })
  447 +
  448 + // 加载大项目部
  449 + request({
  450 + url: '/api/Extend/Organize/GetByName',
  451 + method: 'GET',
  452 + data: { organizeName: '大项目部' }
  453 + }).then(res => {
  454 + this.dxmbOptions = res.data || []
  455 + }).catch(() => {
  456 + this.dxmbOptions = []
  457 + })
204 458 },
205   - getsybOptions(){
206   - previewDataInterface('731056988015822085').then(res => {
207   - this.sybOptions = res.data
208   - });
  459 +
  460 + // 获取部门名称
  461 + getDepartmentName(id, options) {
  462 + const option = options.find(item => item.Id === id)
  463 + return option ? option.FullName : '未知'
209 464 },
210   - getjybOptions(){
211   - previewDataInterface('731056988015822085').then(res => {
212   - this.jybOptions = res.data
213   - });
  465 +
  466 + // 加载所有门店的新店保护状态
  467 + async loadNewStoreStatus() {
  468 + if (!this.list || this.list.length === 0) return
  469 +
  470 + // 并行查询所有门店的保护状态
  471 + const promises = this.list.map(async (row) => {
  472 + if (!row.id) {
  473 + this.$set(row, 'isNewStore', false)
  474 + return
  475 + }
  476 +
  477 + try {
  478 + const res = await request({
  479 + url: `/api/Extend/LqMdXdbhsj/GetByStoreId/${row.id}`,
  480 + method: 'GET'
  481 + })
  482 +
  483 + this.$set(row, 'isNewStore', res.data && res.data.hasProtection === true)
  484 +
  485 + } catch (error) {
  486 + console.error(`查询门店 ${row.dm} 保护时间失败:`, error)
  487 + this.$set(row, 'isNewStore', false)
  488 + }
  489 + })
  490 +
  491 + await Promise.all(promises)
214 492 },
215   - getkjbOptions(){
216   - previewDataInterface('731056988015822085').then(res => {
217   - this.kjbOptions = res.data
218   - });
  493 +
  494 + // 判断是否为新店(通过门店新店保护时间表查询)
  495 + async isNewStore(row) {
  496 + if (!row.id) return false
  497 +
  498 + try {
  499 + const res = await request({
  500 + url: `/api/Extend/LqMdXdbhsj/GetByStoreId/${row.id}`,
  501 + method: 'GET'
  502 + })
  503 +
  504 + const isNew = res.data && res.data.hasProtection === true
  505 + this.$set(row, 'isNewStore', isNew)
  506 + return isNew
  507 + } catch (error) {
  508 + console.error(`查询门店 ${row.dm} 保护时间失败:`, error)
  509 + this.$set(row, 'isNewStore', false)
  510 + return false
  511 + }
219 512 },
220   - getdxmbOptions(){
221   - previewDataInterface('731056988015822085').then(res => {
222   - this.dxmbOptions = res.data
223   - });
  513 +
  514 + // 编辑处理
  515 + editHandle(row) {
  516 + this.dialogTitle = '编辑门店归属'
  517 + this.editForm = {
  518 + id: row.id,
  519 + mdbm: row.mdbm,
  520 + dm: row.dm,
  521 + syb: row.syb || '',
  522 + jyb: row.jyb || '',
  523 + kjb: row.kjb || '',
  524 + dxmb: row.dxmb || ''
  525 + }
  526 + this.dialogVisible = true
224 527 },
225   - initData() {
  528 +
  529 + // 查看处理
  530 + viewHandle(row) {
  531 + this.dialogTitle = '查看门店归属'
  532 + this.editForm = {
  533 + id: row.id,
  534 + mdbm: row.mdbm,
  535 + dm: row.dm,
  536 + syb: row.syb || '',
  537 + jyb: row.jyb || '',
  538 + kjb: row.kjb || '',
  539 + dxmb: row.dxmb || ''
  540 + }
  541 + this.dialogVisible = true
  542 + },
  543 +
  544 + // 批量编辑处理
  545 + batchEditHandle() {
  546 + if (this.multipleSelection.length === 0) {
  547 + this.$message.warning('请先选择要编辑的门店')
  548 + return
  549 + }
  550 + this.batchForm = {
  551 + syb: '',
  552 + jyb: '',
  553 + kjb: '',
  554 + dxmb: ''
  555 + }
  556 + this.batchDialogVisible = true
  557 + },
  558 +
  559 + // 多选处理
  560 + handleSelectionChange(val) {
  561 + this.multipleSelection = val
  562 + },
  563 +
  564 + // 弹窗关闭处理
  565 + handleClose() {
  566 + if (this.saveLoading) {
  567 + this.$message.warning('正在保存中,请稍候...')
  568 + return
  569 + }
  570 + this.dialogVisible = false
  571 + this.$refs.editForm && this.$refs.editForm.resetFields()
  572 + },
  573 +
  574 + // 保存编辑
  575 + saveEdit() {
  576 + this.$refs.editForm.validate((valid) => {
  577 + if (valid) {
  578 + this.saveLoading = true
  579 + request({
  580 + url: `/api/Extend/LqMdxx/${this.editForm.id}`,
  581 + method: 'PUT',
  582 + data: {
  583 + syb: this.editForm.syb,
  584 + jyb: this.editForm.jyb,
  585 + kjb: this.editForm.kjb,
  586 + dxmb: this.editForm.dxmb
  587 + }
  588 + }).then(res => {
  589 + this.$message.success('保存成功')
  590 + this.dialogVisible = false
  591 + this.initData()
  592 + }).catch(() => {
  593 + this.$message.error('保存失败')
  594 + }).finally(() => {
  595 + this.saveLoading = false
  596 + })
  597 + }
  598 + })
  599 + },
  600 +
  601 + // 批量保存编辑
  602 + saveBatchEdit() {
  603 + this.$refs.batchForm.validate((valid) => {
  604 + if (valid) {
  605 + this.batchSaveLoading = true
  606 + const updateData = this.multipleSelection.map(item => ({
  607 + id: item.id,
  608 + syb: this.batchForm.syb,
  609 + jyb: this.batchForm.jyb,
  610 + kjb: this.batchForm.kjb,
  611 + dxmb: this.batchForm.dxmb
  612 + }))
  613 +
  614 + // 批量更新
  615 + Promise.all(updateData.map(data =>
  616 + request({
  617 + url: `/api/Extend/LqMdxx/${data.id}`,
  618 + method: 'PUT',
  619 + data: {
  620 + syb: data.syb,
  621 + jyb: data.jyb,
  622 + kjb: data.kjb,
  623 + dxmb: data.dxmb
  624 + }
  625 + })
  626 + )).then(() => {
  627 + this.$message.success(`成功更新 ${updateData.length} 个门店的归属信息`)
  628 + this.batchDialogVisible = false
  629 + this.multipleSelection = []
  630 + this.initData()
  631 + }).catch(() => {
  632 + this.$message.error('批量更新失败')
  633 + }).finally(() => {
  634 + this.batchSaveLoading = false
  635 + })
  636 + }
  637 + })
  638 + },
  639 +
  640 + async initData() {
226 641 this.listLoading = true;
227 642 let _query = {
228 643 ...this.listQuery,
... ... @@ -236,83 +651,31 @@
236 651 query[key] = _query[key]
237 652 }
238 653 }
239   - request({
240   - url: `/api/Extend/LqMdMdgs`,
241   - method: 'GET',
242   - data: query
243   - }).then(res => {
  654 +
  655 + try {
  656 + const res = await request({
  657 + url: `/api/Extend/LqMdxx`,
  658 + method: 'GET',
  659 + data: query
  660 + })
  661 +
244 662 this.list = res.data.list
245 663 this.total = res.data.pagination.total
  664 +
  665 + // 为每个门店查询新店保护状态
  666 + await this.loadNewStoreStatus()
  667 +
  668 + } catch (error) {
  669 + console.error('加载门店数据失败:', error)
  670 + } finally {
246 671 this.listLoading = false
247   - })
248   - },
249   - handleDel(id) {
250   - this.$confirm('此操作将永久删除该数据, 是否继续?', '提示', {
251   - type: 'warning'
252   - }).then(() => {
253   - request({
254   - url: `/api/Extend/LqMdMdgs/${id}`,
255   - method: 'DELETE'
256   - }).then(res => {
257   - this.$message({
258   - type: 'success',
259   - message: res.msg,
260   - onClose: () => {
261   - this.initData()
262   - }
263   - });
264   - })
265   - }).catch(() => {
266   - });
267   - },
268   - handleSelectionChange(val) {
269   - const res = val.map(item => item.id)
270   - this.multipleSelection = res
271   - },
272   - handleBatchRemoveDel() {
273   - if (!this.multipleSelection.length) {
274   - this.$message({
275   - type: 'error',
276   - message: '请选择一条数据',
277   - duration: 1500,
278   - })
279   - return
280 672 }
281   - const ids = this.multipleSelection
282   - this.$confirm('您确定要删除这些数据吗, 是否继续?', '提示', {
283   - type: 'warning'
284   - }).then(() => {
285   - request({
286   - url: `/api/Extend/LqMdMdgs/batchRemove`,
287   - method: 'POST',
288   - data: ids ,
289   - }).then(res => {
290   - this.$message({
291   - type: 'success',
292   - message: res.msg,
293   - onClose: () => {
294   - this.initData()
295   - }
296   - });
297   - })
298   - }).catch(() => { })
299   - },
300   - addOrUpdateHandle(id, isDetail) {
301   - this.formVisible = true
302   - this.$nextTick(() => {
303   - this.$refs.NCCForm.init(id, isDetail)
304   - })
305   - },
306   - exportData() {
307   - this.exportBoxVisible = true
308   - this.$nextTick(() => {
309   - this.$refs.ExportBox.init(this.columnList)
310   - })
311 673 },
  674 +
312 675 download(data) {
313 676 let query = { ...data, ...this.listQuery, ...this.query }
314 677 request({
315   - url: `/api/Extend/LqMdMdgs/Actions/Export`,
  678 + url: `/api/Extend/LqMdxx/Actions/Export`,
316 679 method: 'GET',
317 680 data: query
318 681 }).then(res => {
... ... @@ -331,10 +694,6 @@
331 694 }
332 695 this.initData()
333 696 },
334   - refresh(isrRefresh) {
335   - this.formVisible = false
336   - if (isrRefresh) this.reset()
337   - },
338 697 reset() {
339 698 for (let key in this.query) {
340 699 this.query[key] = undefined
... ... @@ -348,5 +707,149 @@
348 707 this.initData()
349 708 }
350 709 }
351   - }
352   -</script>
353 710 \ No newline at end of file
  711 + }
  712 +</script>
  713 +
  714 +<style lang="scss" scoped>
  715 + // 页面头部样式
  716 + .NCC-common-head-left {
  717 + display: flex;
  718 + align-items: center;
  719 + gap: 12px;
  720 + }
  721 +
  722 + .NCC-common-head-title {
  723 + margin: 0;
  724 + font-size: 18px;
  725 + font-weight: 600;
  726 + color: #303133;
  727 + display: flex;
  728 + align-items: center;
  729 + gap: 8px;
  730 +
  731 + i {
  732 + color: #409EFF;
  733 + font-size: 20px;
  734 + }
  735 + }
  736 +
  737 + .NCC-common-head-subtitle {
  738 + color: #909399;
  739 + font-size: 14px;
  740 + }
  741 +
  742 + // 表格样式
  743 + .store-name {
  744 + font-weight: 500;
  745 + color: #303133;
  746 + }
  747 +
  748 + .empty-text {
  749 + color: #C0C4CC;
  750 + font-style: italic;
  751 + }
  752 +
  753 + .action-btn {
  754 + padding: 4px 8px;
  755 + margin: 0 2px;
  756 +
  757 + &:hover {
  758 + background-color: #f5f7fa;
  759 + }
  760 + }
  761 +
  762 + // 弹窗样式
  763 + .store-dialog {
  764 + .dialog-header {
  765 + padding: 16px 0;
  766 + border-bottom: 1px solid #EBEEF5;
  767 + margin-bottom: 20px;
  768 +
  769 + .store-info {
  770 + display: flex;
  771 + align-items: center;
  772 + gap: 12px;
  773 +
  774 + i {
  775 + font-size: 20px;
  776 + color: #409EFF;
  777 + }
  778 +
  779 + .store-name {
  780 + font-size: 16px;
  781 + font-weight: 600;
  782 + color: #303133;
  783 + }
  784 + }
  785 + }
  786 +
  787 + .edit-form {
  788 + .el-form-item {
  789 + margin-bottom: 20px;
  790 + }
  791 + }
  792 + }
  793 +
  794 + // 批量编辑样式
  795 + .batch-edit-header {
  796 + display: flex;
  797 + align-items: center;
  798 + gap: 8px;
  799 + padding: 12px 16px;
  800 + background-color: #fdf6ec;
  801 + border: 1px solid #f5dab1;
  802 + border-radius: 4px;
  803 + margin-bottom: 20px;
  804 +
  805 + i {
  806 + color: #e6a23c;
  807 + font-size: 16px;
  808 + }
  809 +
  810 + span {
  811 + color: #e6a23c;
  812 + font-weight: 500;
  813 + }
  814 + }
  815 +
  816 + // 搜索区域样式
  817 + .search-buttons {
  818 + display: flex;
  819 + align-items: center;
  820 + gap: 8px;
  821 + }
  822 +
  823 + // 响应式设计
  824 + @media (max-width: 768px) {
  825 + .NCC-common-head {
  826 + flex-direction: column;
  827 + align-items: flex-start;
  828 + gap: 12px;
  829 +
  830 + .NCC-common-head-right {
  831 + width: 100%;
  832 + justify-content: flex-start;
  833 + }
  834 + }
  835 +
  836 + .el-col {
  837 + margin-bottom: 16px;
  838 + }
  839 +
  840 + .store-dialog {
  841 + .el-dialog {
  842 + width: 95% !important;
  843 + margin: 0 auto;
  844 + }
  845 + }
  846 + }
  847 +
  848 + // 表格响应式
  849 + @media (max-width: 1200px) {
  850 + .NCC-table {
  851 + .el-table {
  852 + font-size: 12px;
  853 + }
  854 + }
  855 + }
  856 +</style>
354 857 \ No newline at end of file
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqMdMdgs/LqMdMdgsInfoOutput.cs deleted
1   -using System;
2   -using System.Collections.Generic;
3   -
4   -namespace NCC.Extend.Entitys.Dto.LqMdMdgs
5   -{
6   - /// <summary>
7   - /// 门店归属输出参数
8   - /// </summary>
9   - public class LqMdMdgsInfoOutput
10   - {
11   - /// <summary>
12   - /// 门店编码
13   - /// </summary>
14   - public string id { get; set; }
15   -
16   - /// <summary>
17   - /// 单据门店编号
18   - /// </summary>
19   - public string djmdbh { get; set; }
20   -
21   - /// <summary>
22   - /// 单据门店
23   - /// </summary>
24   - public string djmd { get; set; }
25   -
26   - /// <summary>
27   - /// 门店名称
28   - /// </summary>
29   - public string mdmc { get; set; }
30   -
31   - /// <summary>
32   - /// 事业部
33   - /// </summary>
34   - public string syb { get; set; }
35   -
36   - /// <summary>
37   - /// 教育部
38   - /// </summary>
39   - public string jyb { get; set; }
40   -
41   - /// <summary>
42   - /// 科技部
43   - /// </summary>
44   - public string kjb { get; set; }
45   -
46   - /// <summary>
47   - /// 大项目部
48   - /// </summary>
49   - public string dxmb { get; set; }
50   -
51   - /// <summary>
52   - /// 归属起始时间
53   - /// </summary>
54   - public DateTime? gsqssj { get; set; }
55   -
56   - /// <summary>
57   - /// 归属终止时间
58   - /// </summary>
59   - public DateTime? gszzsj { get; set; }
60   -
61   - /// <summary>
62   - /// 修改信息
63   - /// </summary>
64   - public string xgxx { get; set; }
65   -
66   - }
67   -}
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqMdMdgs/LqMdMdgsListOutput.cs deleted
1   -using System;
2   -
3   -namespace NCC.Extend.Entitys.Dto.LqMdMdgs
4   -{
5   - /// <summary>
6   - /// 门店归属输入参数
7   - /// </summary>
8   - public class LqMdMdgsListOutput
9   - {
10   - /// <summary>
11   - /// 门店编码
12   - /// </summary>
13   - public string id { get; set; }
14   -
15   - /// <summary>
16   - /// 单据门店编号
17   - /// </summary>
18   - public string djmdbh { get; set; }
19   -
20   - /// <summary>
21   - /// 单据门店
22   - /// </summary>
23   - public string djmd { get; set; }
24   -
25   - /// <summary>
26   - /// 门店名称
27   - /// </summary>
28   - public string mdmc { get; set; }
29   -
30   - /// <summary>
31   - /// 事业部
32   - /// </summary>
33   - public string syb { get; set; }
34   -
35   - /// <summary>
36   - /// 教育部
37   - /// </summary>
38   - public string jyb { get; set; }
39   -
40   - /// <summary>
41   - /// 科技部
42   - /// </summary>
43   - public string kjb { get; set; }
44   -
45   - /// <summary>
46   - /// 大项目部
47   - /// </summary>
48   - public string dxmb { get; set; }
49   -
50   - /// <summary>
51   - /// 归属起始时间
52   - /// </summary>
53   - public DateTime? gsqssj { get; set; }
54   -
55   - /// <summary>
56   - /// 归属终止时间
57   - /// </summary>
58   - public DateTime? gszzsj { get; set; }
59   -
60   - /// <summary>
61   - /// 修改信息
62   - /// </summary>
63   - public string xgxx { get; set; }
64   -
65   - }
66   -}
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqMdMdgs/LqMdMdgsUpInput.cs deleted
1   -using System;
2   -using System.Collections.Generic;
3   -
4   -namespace NCC.Extend.Entitys.Dto.LqMdMdgs
5   -{
6   - /// <summary>
7   - /// 门店归属更新输入参数
8   - /// </summary>
9   - public class LqMdMdgsUpInput : LqMdMdgsCrInput
10   - {
11   - /// <summary>
12   - /// 门店编码
13   - /// </summary>
14   - public string id { get; set; }
15   -
16   - }
17   -}
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqMdxx/LqMdxxCrInput.cs
... ... @@ -83,5 +83,40 @@ namespace NCC.Extend.Entitys.Dto.LqMdxx
83 83 /// </summary>
84 84 public string ywsb { get; set; }
85 85  
  86 + /// <summary>
  87 + /// 事业部
  88 + /// </summary>
  89 + public string syb { get; set; }
  90 +
  91 + /// <summary>
  92 + /// 教育部
  93 + /// </summary>
  94 + public string jyb { get; set; }
  95 +
  96 + /// <summary>
  97 + /// 科技部
  98 + /// </summary>
  99 + public string kjb { get; set; }
  100 +
  101 + /// <summary>
  102 + /// 大项目部
  103 + /// </summary>
  104 + public string dxmb { get; set; }
  105 +
  106 + /// <summary>
  107 + /// 归属起始时间
  108 + /// </summary>
  109 + public DateTime? gsqssj { get; set; }
  110 +
  111 + /// <summary>
  112 + /// 归属终止时间
  113 + /// </summary>
  114 + public DateTime? gszzsj { get; set; }
  115 +
  116 + /// <summary>
  117 + /// 状态
  118 + /// </summary>
  119 + public int? status { get; set; }
  120 +
86 121 }
87 122 }
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqMdxx/LqMdxxInfoOutput.cs
... ... @@ -83,5 +83,40 @@ namespace NCC.Extend.Entitys.Dto.LqMdxx
83 83 /// </summary>
84 84 public string ywsb { get; set; }
85 85  
  86 + /// <summary>
  87 + /// 事业部
  88 + /// </summary>
  89 + public string syb { get; set; }
  90 +
  91 + /// <summary>
  92 + /// 教育部
  93 + /// </summary>
  94 + public string jyb { get; set; }
  95 +
  96 + /// <summary>
  97 + /// 科技部
  98 + /// </summary>
  99 + public string kjb { get; set; }
  100 +
  101 + /// <summary>
  102 + /// 大项目部
  103 + /// </summary>
  104 + public string dxmb { get; set; }
  105 +
  106 + /// <summary>
  107 + /// 归属起始时间
  108 + /// </summary>
  109 + public DateTime? gsqssj { get; set; }
  110 +
  111 + /// <summary>
  112 + /// 归属终止时间
  113 + /// </summary>
  114 + public DateTime? gszzsj { get; set; }
  115 +
  116 + /// <summary>
  117 + /// 状态
  118 + /// </summary>
  119 + public int? status { get; set; }
  120 +
86 121 }
87 122 }
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqMdxx/LqMdxxListOutput.cs
... ... @@ -82,5 +82,40 @@ namespace NCC.Extend.Entitys.Dto.LqMdxx
82 82 /// </summary>
83 83 public string ywsb { get; set; }
84 84  
  85 + /// <summary>
  86 + /// 事业部
  87 + /// </summary>
  88 + public string syb { get; set; }
  89 +
  90 + /// <summary>
  91 + /// 教育部
  92 + /// </summary>
  93 + public string jyb { get; set; }
  94 +
  95 + /// <summary>
  96 + /// 科技部
  97 + /// </summary>
  98 + public string kjb { get; set; }
  99 +
  100 + /// <summary>
  101 + /// 大项目部
  102 + /// </summary>
  103 + public string dxmb { get; set; }
  104 +
  105 + /// <summary>
  106 + /// 归属起始时间
  107 + /// </summary>
  108 + public DateTime? gsqssj { get; set; }
  109 +
  110 + /// <summary>
  111 + /// 归属终止时间
  112 + /// </summary>
  113 + public DateTime? gszzsj { get; set; }
  114 +
  115 + /// <summary>
  116 + /// 状态
  117 + /// </summary>
  118 + public int? status { get; set; }
  119 +
85 120 }
86 121 }
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqMdMdgs/LqMdMdgsListQueryInput.cs renamed to netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/Organize/OrganizeListOutput.cs
1   -using NCC.Common.Filter;
2   -using System.Collections.Generic;
  1 +using System;
3 2  
4   -namespace NCC.Extend.Entitys.Dto.LqMdMdgs
  3 +namespace NCC.Extend.Entitys.Dto.Organize
5 4 {
6 5 /// <summary>
7   - /// 门店归属列表查询输入
  6 + /// 组织架构列表输出
8 7 /// </summary>
9   - public class LqMdMdgsListQueryInput : PageInputBase
  8 + public class OrganizeListOutput
10 9 {
11 10 /// <summary>
12   - /// 选择导出数据key
  11 + /// 主键
13 12 /// </summary>
14   - public string selectKey { get; set; }
  13 + public string Id { get; set; }
15 14  
16 15 /// <summary>
17   - ///
  16 + /// 组织名称
18 17 /// </summary>
19   - public int dataType { get; set; }
20   -
  18 + public string FullName { get; set; }
21 19  
22 20 /// <summary>
23   - /// 门店编码
  21 + /// 组织编码
24 22 /// </summary>
25   - public string id { get; set; }
26   -
  23 + public string EnCode { get; set; }
  24 +
27 25 /// <summary>
28   - /// 单据门店编号
  26 + /// 组织分类【company-公司、department-部门】
29 27 /// </summary>
30   - public string djmdbh { get; set; }
31   -
  28 + public string Category { get; set; }
  29 +
32 30 /// <summary>
33   - /// 单据门店
  31 + /// 父级组织ID
34 32 /// </summary>
35   - public string djmd { get; set; }
36   -
  33 + public string ParentId { get; set; }
  34 +
37 35 /// <summary>
38   - /// 门店名称
  36 + /// 父级组织名称
39 37 /// </summary>
40   - public string mdmc { get; set; }
41   -
  38 + public string ParentName { get; set; }
  39 +
42 40 /// <summary>
43   - /// 事业部
  41 + /// 组织主管ID
44 42 /// </summary>
45   - public string syb { get; set; }
46   -
  43 + public string ManagerId { get; set; }
  44 +
47 45 /// <summary>
48   - /// 教育部
  46 + /// 组织主管姓名
49 47 /// </summary>
50   - public string jyb { get; set; }
51   -
  48 + public string ManagerName { get; set; }
  49 +
52 50 /// <summary>
53   - /// 科技部
  51 + /// 描述
54 52 /// </summary>
55   - public string kjb { get; set; }
56   -
  53 + public string Description { get; set; }
  54 +
57 55 /// <summary>
58   - /// 大项目部
  56 + /// 排序码
59 57 /// </summary>
60   - public string dxmb { get; set; }
61   -
  58 + public long? SortCode { get; set; }
  59 +
62 60 /// <summary>
63   - /// 归属起始时间
  61 + /// 是否启用
64 62 /// </summary>
65   - public string gsqssj { get; set; }
66   -
  63 + public int? EnabledMark { get; set; }
  64 +
67 65 /// <summary>
68   - /// 归属终止时间
  66 + /// 创建时间
69 67 /// </summary>
70   - public string gszzsj { get; set; }
71   -
  68 + public DateTime? CreatorTime { get; set; }
  69 +
72 70 /// <summary>
73   - /// 修改信息
  71 + /// 子组织数量
74 72 /// </summary>
75   - public string xgxx { get; set; }
76   -
  73 + public int ChildrenCount { get; set; }
77 74 }
78 75 }
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/Organize/OrganizeListQueryInput.cs 0 → 100644
  1 +using NCC.Common.Filter;
  2 +
  3 +namespace NCC.Extend.Entitys.Dto.Organize
  4 +{
  5 + /// <summary>
  6 + /// 组织架构查询输入参数
  7 + /// </summary>
  8 + public class OrganizeListQueryInput : PageInputBase
  9 + {
  10 + /// <summary>
  11 + /// 组织名称(模糊查询)
  12 + /// </summary>
  13 + public string FullName { get; set; }
  14 +
  15 + /// <summary>
  16 + /// 组织编码
  17 + /// </summary>
  18 + public string EnCode { get; set; }
  19 +
  20 + /// <summary>
  21 + /// 组织分类【company-公司、department-部门】
  22 + /// </summary>
  23 + public string Category { get; set; }
  24 +
  25 + /// <summary>
  26 + /// 父级组织ID
  27 + /// </summary>
  28 + public string ParentId { get; set; }
  29 +
  30 + /// <summary>
  31 + /// 是否启用
  32 + /// </summary>
  33 + public int? EnabledMark { get; set; }
  34 + }
  35 +}
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqMdMdgs/LqMdMdgsCrInput.cs renamed to netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/Organize/OrganizeTreeOutput.cs
1   -using System;
2 1 using System.Collections.Generic;
3 2  
4   -namespace NCC.Extend.Entitys.Dto.LqMdMdgs
  3 +namespace NCC.Extend.Entitys.Dto.Organize
5 4 {
6 5 /// <summary>
7   - /// 门店归属修改输入参数
  6 + /// 组织架构树形输出
8 7 /// </summary>
9   - public class LqMdMdgsCrInput
  8 + public class OrganizeTreeOutput
10 9 {
11 10 /// <summary>
12   - /// 门店编码
  11 + /// 主键
13 12 /// </summary>
14   - public string id { get; set; }
15   -
16   - /// <summary>
17   - /// 单据门店编号
18   - /// </summary>
19   - public string djmdbh { get; set; }
20   -
  13 + public string Id { get; set; }
  14 +
21 15 /// <summary>
22   - /// 单据门店
  16 + /// 组织名称
23 17 /// </summary>
24   - public string djmd { get; set; }
25   -
  18 + public string FullName { get; set; }
  19 +
26 20 /// <summary>
27   - /// 门店名称
  21 + /// 组织编码
28 22 /// </summary>
29   - public string mdmc { get; set; }
30   -
  23 + public string EnCode { get; set; }
  24 +
31 25 /// <summary>
32   - /// 事业部
  26 + /// 组织分类【company-公司、department-部门】
33 27 /// </summary>
34   - public string syb { get; set; }
35   -
  28 + public string Category { get; set; }
  29 +
36 30 /// <summary>
37   - /// 教育部
  31 + /// 父级组织ID
38 32 /// </summary>
39   - public string jyb { get; set; }
40   -
  33 + public string ParentId { get; set; }
  34 +
41 35 /// <summary>
42   - /// 科技部
  36 + /// 组织主管ID
43 37 /// </summary>
44   - public string kjb { get; set; }
45   -
  38 + public string ManagerId { get; set; }
  39 +
46 40 /// <summary>
47   - /// 大项目部
  41 + /// 描述
48 42 /// </summary>
49   - public string dxmb { get; set; }
50   -
  43 + public string Description { get; set; }
  44 +
51 45 /// <summary>
52   - /// 归属起始时间
  46 + /// 排序码
53 47 /// </summary>
54   - public DateTime? gsqssj { get; set; }
55   -
  48 + public long? SortCode { get; set; }
  49 +
56 50 /// <summary>
57   - /// 归属终止时间
  51 + /// 是否启用
58 52 /// </summary>
59   - public DateTime? gszzsj { get; set; }
60   -
  53 + public int? EnabledMark { get; set; }
  54 +
61 55 /// <summary>
62   - /// 修改信息
  56 + /// 子组织列表
63 57 /// </summary>
64   - public string xgxx { get; set; }
65   -
  58 + public List<OrganizeTreeOutput> Children { get; set; } = new List<OrganizeTreeOutput>();
66 59 }
67 60 }
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_md_mdgs/LqMdMdgsEntity.cs deleted
1   -using NCC.Common.Const;
2   -using SqlSugar;
3   -using System;
4   -
5   -namespace NCC.Extend.Entitys.lq_md_mdgs
6   -{
7   - /// <summary>
8   - /// 门店归属
9   - /// </summary>
10   - [SugarTable("lq_md_mdgs")]
11   - [Tenant(ClaimConst.TENANT_ID)]
12   - public class LqMdMdgsEntity
13   - {
14   - /// <summary>
15   - /// 门店编码
16   - /// </summary>
17   - [SugarColumn(ColumnName = "F_Id", IsPrimaryKey = true)]
18   - public string Id { get; set; }
19   -
20   - /// <summary>
21   - /// 单据门店编号
22   - /// </summary>
23   - [SugarColumn(ColumnName = "djmdbh")]
24   - public string Djmdbh { get; set; }
25   -
26   - /// <summary>
27   - /// 单据门店
28   - /// </summary>
29   - [SugarColumn(ColumnName = "djmd")]
30   - public string Djmd { get; set; }
31   -
32   - /// <summary>
33   - /// 门店名称
34   - /// </summary>
35   - [SugarColumn(ColumnName = "mdmc")]
36   - public string Mdmc { get; set; }
37   -
38   - /// <summary>
39   - /// 事业部
40   - /// </summary>
41   - [SugarColumn(ColumnName = "syb")]
42   - public string Syb { get; set; }
43   -
44   - /// <summary>
45   - /// 教育部
46   - /// </summary>
47   - [SugarColumn(ColumnName = "jyb")]
48   - public string Jyb { get; set; }
49   -
50   - /// <summary>
51   - /// 科技部
52   - /// </summary>
53   - [SugarColumn(ColumnName = "kjb")]
54   - public string Kjb { get; set; }
55   -
56   - /// <summary>
57   - /// 大项目部
58   - /// </summary>
59   - [SugarColumn(ColumnName = "dxmb")]
60   - public string Dxmb { get; set; }
61   -
62   - /// <summary>
63   - /// 归属起始时间
64   - /// </summary>
65   - [SugarColumn(ColumnName = "gsqssj")]
66   - public DateTime? Gsqssj { get; set; }
67   -
68   - /// <summary>
69   - /// 归属终止时间
70   - /// </summary>
71   - [SugarColumn(ColumnName = "gszzsj")]
72   - public DateTime? Gszzsj { get; set; }
73   -
74   - /// <summary>
75   - /// 修改信息
76   - /// </summary>
77   - [SugarColumn(ColumnName = "xgxx")]
78   - public string Xgxx { get; set; }
79   -
80   - }
81   -}
82 0 \ No newline at end of file
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_mdxx/LqMdxxEntity.cs
... ... @@ -101,5 +101,47 @@ namespace NCC.Extend.Entitys.lq_mdxx
101 101 [SugarColumn(ColumnName = "ywsb")]
102 102 public string Ywsb { get; set; }
103 103  
  104 + /// <summary>
  105 + /// 事业部
  106 + /// </summary>
  107 + [SugarColumn(ColumnName = "syb")]
  108 + public string Syb { get; set; }
  109 +
  110 + /// <summary>
  111 + /// 教育部
  112 + /// </summary>
  113 + [SugarColumn(ColumnName = "jyb")]
  114 + public string Jyb { get; set; }
  115 +
  116 + /// <summary>
  117 + /// 科技部
  118 + /// </summary>
  119 + [SugarColumn(ColumnName = "kjb")]
  120 + public string Kjb { get; set; }
  121 +
  122 + /// <summary>
  123 + /// 大项目部
  124 + /// </summary>
  125 + [SugarColumn(ColumnName = "dxmb")]
  126 + public string Dxmb { get; set; }
  127 +
  128 + /// <summary>
  129 + /// 归属起始时间
  130 + /// </summary>
  131 + [SugarColumn(ColumnName = "gsqssj")]
  132 + public DateTime? Gsqssj { get; set; }
  133 +
  134 + /// <summary>
  135 + /// 归属终止时间
  136 + /// </summary>
  137 + [SugarColumn(ColumnName = "gszzsj")]
  138 + public DateTime? Gszzsj { get; set; }
  139 +
  140 + /// <summary>
  141 + /// 状态
  142 + /// </summary>
  143 + [SugarColumn(ColumnName = "status")]
  144 + public int? Status { get; set; }
  145 +
104 146 }
105 147 }
106 148 \ No newline at end of file
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Mapper/LqMdMdgsMapper.cs deleted
1   -using NCC.Common.Helper;
2   -using NCC.Extend.Entitys.Dto.LqMdMdgs;
3   -using Mapster;
4   -using System.Collections.Generic;
5   -
6   -namespace NCC.Extend.Entitys.Mapper.LqMdMdgs
7   -{
8   - public class Mapper : IRegister
9   - {
10   - public void Register(TypeAdapterConfig config)
11   - {
12   - }
13   - }
14   -}
netcore/src/Modularity/Extend/NCC.Extend.Interfaces/ILqMdMdgsService.cs deleted
1   -namespace NCC.Extend.Interfaces.LqMdMdgs
2   -{
3   - public interface ILqMdMdgsService
4   - {
5   - }
6   -}
7 0 \ No newline at end of file
netcore/src/Modularity/Extend/NCC.Extend.Interfaces/Organize/IOrganizeService.cs 0 → 100644
  1 +using NCC.Common.Entity;
  2 +using NCC.Extend.Entitys.Dto.Organize;
  3 +using System.Collections.Generic;
  4 +using System.Threading.Tasks;
  5 +
  6 +namespace NCC.Extend.Interfaces.Organize
  7 +{
  8 + /// <summary>
  9 + /// 组织架构服务接口
  10 + /// </summary>
  11 + public interface IOrganizeService
  12 + {
  13 + #region 组织架构查询
  14 +
  15 + /// <summary>
  16 + /// 获取组织架构列表
  17 + /// </summary>
  18 + /// <remarks>
  19 + /// 根据查询条件获取组织架构列表,支持分页查询
  20 + ///
  21 + /// 示例请求:
  22 + /// ```json
  23 + /// {
  24 + /// "fullName": "技术部",
  25 + /// "category": "department",
  26 + /// "parentId": "ORG001",
  27 + /// "currentPage": 1,
  28 + /// "pageSize": 20
  29 + /// }
  30 + /// ```
  31 + ///
  32 + /// 参数说明:
  33 + /// - fullName: 组织名称(模糊查询)
  34 + /// - category: 组织分类(company-公司、department-部门)
  35 + /// - parentId: 父级组织ID
  36 + /// - currentPage: 当前页码
  37 + /// - pageSize: 每页大小
  38 + /// </remarks>
  39 + /// <param name="input">查询参数</param>
  40 + /// <returns>组织架构列表</returns>
  41 + /// <response code="200">成功返回组织架构列表</response>
  42 + /// <response code="400">查询参数错误</response>
  43 + /// <response code="500">服务器内部错误</response>
  44 + Task<dynamic> GetList(OrganizeListQueryInput input);
  45 +
  46 + /// <summary>
  47 + /// 获取组织架构树形结构
  48 + /// </summary>
  49 + /// <remarks>
  50 + /// 获取完整的组织架构树形结构,包含所有子组织
  51 + ///
  52 + /// 示例请求:
  53 + /// ```json
  54 + /// {
  55 + /// "parentId": "ORG001"
  56 + /// }
  57 + /// ```
  58 + ///
  59 + /// 参数说明:
  60 + /// - parentId: 根节点组织ID(可选,不传则从顶级开始)
  61 + /// </remarks>
  62 + /// <param name="parentId">父级组织ID(可选)</param>
  63 + /// <returns>组织架构树形结构</returns>
  64 + /// <response code="200">成功返回组织架构树</response>
  65 + /// <response code="500">服务器内部错误</response>
  66 + Task<List<OrganizeTreeOutput>> GetTree(string parentId = null);
  67 +
  68 + /// <summary>
  69 + /// 根据组织名称获取该机构下面的所有组织
  70 + /// </summary>
  71 + /// <remarks>
  72 + /// 通过组织名称查找组织,并返回该组织及其所有子组织
  73 + ///
  74 + /// 示例请求:
  75 + /// ```json
  76 + /// {
  77 + /// "organizeName": "技术部"
  78 + /// }
  79 + /// ```
  80 + ///
  81 + /// 参数说明:
  82 + /// - organizeName: 组织名称(支持模糊查询)
  83 + /// </remarks>
  84 + /// <param name="organizeName">组织名称</param>
  85 + /// <returns>组织及其子组织列表</returns>
  86 + /// <response code="200">成功返回组织列表</response>
  87 + /// <response code="400">组织名称不能为空</response>
  88 + /// <response code="404">未找到指定组织</response>
  89 + /// <response code="500">服务器内部错误</response>
  90 + Task<dynamic> GetOrganizationsByName(string organizeName);
  91 +
  92 + /// <summary>
  93 + /// 获取组织选择器数据
  94 + /// </summary>
  95 + /// <remarks>
  96 + /// 获取组织选择器所需的数据,用于下拉选择
  97 + ///
  98 + /// 示例请求:
  99 + /// ```json
  100 + /// {
  101 + /// "parentId": "ORG001"
  102 + /// }
  103 + /// ```
  104 + ///
  105 + /// 参数说明:
  106 + /// - parentId: 父级组织ID(可选)
  107 + /// </remarks>
  108 + /// <param name="parentId">父级组织ID(可选)</param>
  109 + /// <returns>组织选择器数据</returns>
  110 + /// <response code="200">成功返回组织选择器数据</response>
  111 + /// <response code="500">服务器内部错误</response>
  112 + Task<dynamic> GetSelector(string parentId = null);
  113 +
  114 + #endregion
  115 + }
  116 +}
... ...
netcore/src/Modularity/Extend/NCC.Extend/LqMdMdgsService.cs deleted
1   -using NCC.Common.Core.Manager;
2   -using NCC.Common.Enum;
3   -using NCC.Common.Extension;
4   -using NCC.Common.Filter;
5   -using NCC.Dependency;
6   -using NCC.DynamicApiController;
7   -using NCC.FriendlyException;
8   -using NCC.Extend.Interfaces.LqMdMdgs;
9   -using Mapster;
10   -using Microsoft.AspNetCore.Mvc;
11   -using SqlSugar;
12   -using System;
13   -using System.Collections.Generic;
14   -using System.Linq;
15   -using System.Threading.Tasks;
16   -using NCC.Extend.Entitys.lq_md_mdgs;
17   -using NCC.Extend.Entitys.Dto.LqMdMdgs;
18   -using Yitter.IdGenerator;
19   -using NCC.Common.Helper;
20   -using NCC.JsonSerialization;
21   -using NCC.Common.Model.NPOI;
22   -using NCC.Common.Configuration;
23   -using NCC.DataEncryption;
24   -using NCC.ClayObject;
25   -
26   -namespace NCC.Extend.LqMdMdgs
27   -{
28   - /// <summary>
29   - /// 门店归属服务
30   - /// </summary>
31   - [ApiDescriptionSettings(Tag = "Extend",Name = "LqMdMdgs", Order = 200)]
32   - [Route("api/Extend/[controller]")]
33   - public class LqMdMdgsService : ILqMdMdgsService, IDynamicApiController, ITransient
34   - {
35   - private readonly ISqlSugarRepository<LqMdMdgsEntity> _lqMdMdgsRepository;
36   - private readonly SqlSugarScope _db;
37   - private readonly IUserManager _userManager;
38   -
39   - /// <summary>
40   - /// 初始化一个<see cref="LqMdMdgsService"/>类型的新实例
41   - /// </summary>
42   - public LqMdMdgsService(
43   - ISqlSugarRepository<LqMdMdgsEntity> lqMdMdgsRepository,
44   - IUserManager userManager)
45   - {
46   - _lqMdMdgsRepository = lqMdMdgsRepository;
47   - _db = _lqMdMdgsRepository.Context;
48   - _userManager = userManager;
49   - }
50   -
51   - /// <summary>
52   - /// 获取门店归属
53   - /// </summary>
54   - /// <param name="id">参数</param>
55   - /// <returns></returns>
56   - [HttpGet("{id}")]
57   - public async Task<dynamic> GetInfo(string id)
58   - {
59   - var entity = await _db.Queryable<LqMdMdgsEntity>().FirstAsync(p => p.Id == id);
60   - var output = entity.Adapt<LqMdMdgsInfoOutput>();
61   - return output;
62   - }
63   -
64   - /// <summary>
65   - /// 获取门店归属列表
66   - /// </summary>
67   - /// <param name="input">请求参数</param>
68   - /// <returns></returns>
69   - [HttpGet("")]
70   - public async Task<dynamic> GetList([FromQuery] LqMdMdgsListQueryInput input)
71   - {
72   - var sidx = input.sidx == null ? "id" : input.sidx;
73   - List<string> queryGsqssj = input.gsqssj != null ? input.gsqssj.Split(',').ToObeject<List<string>>() : null;
74   - DateTime? startGsqssj = queryGsqssj != null ? Ext.GetDateTime(queryGsqssj.First()) : null;
75   - DateTime? endGsqssj = queryGsqssj != null ? Ext.GetDateTime(queryGsqssj.Last()) : null;
76   - List<string> queryGszzsj = input.gszzsj != null ? input.gszzsj.Split(',').ToObeject<List<string>>() : null;
77   - DateTime? startGszzsj = queryGszzsj != null ? Ext.GetDateTime(queryGszzsj.First()) : null;
78   - DateTime? endGszzsj = queryGszzsj != null ? Ext.GetDateTime(queryGszzsj.Last()) : null;
79   - var data = await _db.Queryable<LqMdMdgsEntity>()
80   - .WhereIF(!string.IsNullOrEmpty(input.id), p => p.Id.Contains(input.id))
81   - .WhereIF(!string.IsNullOrEmpty(input.djmdbh), p => p.Djmdbh.Contains(input.djmdbh))
82   - .WhereIF(!string.IsNullOrEmpty(input.djmd), p => p.Djmd.Contains(input.djmd))
83   - .WhereIF(!string.IsNullOrEmpty(input.mdmc), p => p.Mdmc.Equals(input.mdmc))
84   - .WhereIF(!string.IsNullOrEmpty(input.syb), p => p.Syb.Equals(input.syb))
85   - .WhereIF(!string.IsNullOrEmpty(input.jyb), p => p.Jyb.Equals(input.jyb))
86   - .WhereIF(!string.IsNullOrEmpty(input.kjb), p => p.Kjb.Equals(input.kjb))
87   - .WhereIF(!string.IsNullOrEmpty(input.dxmb), p => p.Dxmb.Equals(input.dxmb))
88   - .WhereIF(queryGsqssj != null, p => p.Gsqssj >= new DateTime(startGsqssj.ToDate().Year, startGsqssj.ToDate().Month, startGsqssj.ToDate().Day, 0, 0, 0))
89   - .WhereIF(queryGsqssj != null, p => p.Gsqssj <= new DateTime(endGsqssj.ToDate().Year, endGsqssj.ToDate().Month, endGsqssj.ToDate().Day, 23, 59, 59))
90   - .WhereIF(queryGszzsj != null, p => p.Gszzsj >= new DateTime(startGszzsj.ToDate().Year, startGszzsj.ToDate().Month, startGszzsj.ToDate().Day, 0, 0, 0))
91   - .WhereIF(queryGszzsj != null, p => p.Gszzsj <= new DateTime(endGszzsj.ToDate().Year, endGszzsj.ToDate().Month, endGszzsj.ToDate().Day, 23, 59, 59))
92   - .WhereIF(!string.IsNullOrEmpty(input.xgxx), p => p.Xgxx.Contains(input.xgxx))
93   - .Select(it=> new LqMdMdgsListOutput
94   - {
95   - id = it.Id,
96   - djmdbh=it.Djmdbh,
97   - djmd=it.Djmd,
98   - mdmc=it.Mdmc,
99   - syb=it.Syb,
100   - jyb=it.Jyb,
101   - kjb=it.Kjb,
102   - dxmb=it.Dxmb,
103   - gsqssj=it.Gsqssj,
104   - gszzsj=it.Gszzsj,
105   - xgxx=it.Xgxx,
106   - }).MergeTable().OrderBy(sidx+" "+input.sort).ToPagedListAsync(input.currentPage, input.pageSize);
107   - return PageResult<LqMdMdgsListOutput>.SqlSugarPageResult(data);
108   - }
109   -
110   - /// <summary>
111   - /// 新建门店归属
112   - /// </summary>
113   - /// <param name="input">参数</param>
114   - /// <returns></returns>
115   - [HttpPost("")]
116   - public async Task Create([FromBody] LqMdMdgsCrInput input)
117   - {
118   - var userInfo = await _userManager.GetUserInfo();
119   - var entity = input.Adapt<LqMdMdgsEntity>();
120   - entity.Id = YitIdHelper.NextId().ToString();
121   - var isOk = await _db.Insertable(entity).IgnoreColumns(ignoreNullColumn: true).ExecuteCommandAsync();
122   - if (!(isOk > 0)) throw NCCException.Oh(ErrorCode.COM1000);
123   - }
124   -
125   - /// <summary>
126   - /// 获取门店归属无分页列表
127   - /// </summary>
128   - /// <param name="input">请求参数</param>
129   - /// <returns></returns>
130   - [NonAction]
131   - public async Task<dynamic> GetNoPagingList([FromQuery] LqMdMdgsListQueryInput input)
132   - {
133   - var sidx = input.sidx == null ? "id" : input.sidx;
134   - List<string> queryGsqssj = input.gsqssj != null ? input.gsqssj.Split(',').ToObeject<List<string>>() : null;
135   - DateTime? startGsqssj = queryGsqssj != null ? Ext.GetDateTime(queryGsqssj.First()) : null;
136   - DateTime? endGsqssj = queryGsqssj != null ? Ext.GetDateTime(queryGsqssj.Last()) : null;
137   - List<string> queryGszzsj = input.gszzsj != null ? input.gszzsj.Split(',').ToObeject<List<string>>() : null;
138   - DateTime? startGszzsj = queryGszzsj != null ? Ext.GetDateTime(queryGszzsj.First()) : null;
139   - DateTime? endGszzsj = queryGszzsj != null ? Ext.GetDateTime(queryGszzsj.Last()) : null;
140   - var data = await _db.Queryable<LqMdMdgsEntity>()
141   - .WhereIF(!string.IsNullOrEmpty(input.id), p => p.Id.Contains(input.id))
142   - .WhereIF(!string.IsNullOrEmpty(input.djmdbh), p => p.Djmdbh.Contains(input.djmdbh))
143   - .WhereIF(!string.IsNullOrEmpty(input.djmd), p => p.Djmd.Contains(input.djmd))
144   - .WhereIF(!string.IsNullOrEmpty(input.mdmc), p => p.Mdmc.Equals(input.mdmc))
145   - .WhereIF(!string.IsNullOrEmpty(input.syb), p => p.Syb.Equals(input.syb))
146   - .WhereIF(!string.IsNullOrEmpty(input.jyb), p => p.Jyb.Equals(input.jyb))
147   - .WhereIF(!string.IsNullOrEmpty(input.kjb), p => p.Kjb.Equals(input.kjb))
148   - .WhereIF(!string.IsNullOrEmpty(input.dxmb), p => p.Dxmb.Equals(input.dxmb))
149   - .WhereIF(queryGsqssj != null, p => p.Gsqssj >= new DateTime(startGsqssj.ToDate().Year, startGsqssj.ToDate().Month, startGsqssj.ToDate().Day, 0, 0, 0))
150   - .WhereIF(queryGsqssj != null, p => p.Gsqssj <= new DateTime(endGsqssj.ToDate().Year, endGsqssj.ToDate().Month, endGsqssj.ToDate().Day, 23, 59, 59))
151   - .WhereIF(queryGszzsj != null, p => p.Gszzsj >= new DateTime(startGszzsj.ToDate().Year, startGszzsj.ToDate().Month, startGszzsj.ToDate().Day, 0, 0, 0))
152   - .WhereIF(queryGszzsj != null, p => p.Gszzsj <= new DateTime(endGszzsj.ToDate().Year, endGszzsj.ToDate().Month, endGszzsj.ToDate().Day, 23, 59, 59))
153   - .WhereIF(!string.IsNullOrEmpty(input.xgxx), p => p.Xgxx.Contains(input.xgxx))
154   - .Select(it=> new LqMdMdgsListOutput
155   - {
156   - id = it.Id,
157   - djmdbh=it.Djmdbh,
158   - djmd=it.Djmd,
159   - mdmc=it.Mdmc,
160   - syb=it.Syb,
161   - jyb=it.Jyb,
162   - kjb=it.Kjb,
163   - dxmb=it.Dxmb,
164   - gsqssj=it.Gsqssj,
165   - gszzsj=it.Gszzsj,
166   - xgxx=it.Xgxx,
167   - }).MergeTable().OrderBy(sidx+" "+input.sort).ToListAsync();
168   - return data;
169   - }
170   -
171   - /// <summary>
172   - /// 导出门店归属
173   - /// </summary>
174   - /// <param name="input">请求参数</param>
175   - /// <returns></returns>
176   - [HttpGet("Actions/Export")]
177   - public async Task<dynamic> Export([FromQuery] LqMdMdgsListQueryInput input)
178   - {
179   - var userInfo = await _userManager.GetUserInfo();
180   - var exportData = new List<LqMdMdgsListOutput>();
181   - if (input.dataType == 0)
182   - {
183   - var data = Clay.Object(await this.GetList(input));
184   - exportData = data.Solidify<PageResult<LqMdMdgsListOutput>>().list;
185   - }
186   - else
187   - {
188   - exportData = await this.GetNoPagingList(input);
189   - }
190   - List<ParamsModel> paramList = "[{\"value\":\"门店编码\",\"field\":\"id\"},{\"value\":\"单据门店编号\",\"field\":\"djmdbh\"},{\"value\":\"单据门店\",\"field\":\"djmd\"},{\"value\":\"事业部\",\"field\":\"syb\"},{\"value\":\"教育部\",\"field\":\"jyb\"},{\"value\":\"科技部\",\"field\":\"kjb\"},{\"value\":\"大项目部\",\"field\":\"dxmb\"},{\"value\":\"归属起始时间\",\"field\":\"gsqssj\"},{\"value\":\"归属终止时间\",\"field\":\"gszzsj\"},{\"value\":\"修改信息\",\"field\":\"xgxx\"},{\"value\":\"门店名称\",\"field\":\"mdmc\"},]".ToList<ParamsModel>();
191   - ExcelConfig excelconfig = new ExcelConfig();
192   - excelconfig.FileName = "门店归属.xls";
193   - excelconfig.HeadFont = "微软雅黑";
194   - excelconfig.HeadPoint = 10;
195   - excelconfig.IsAllSizeColumn = true;
196   - excelconfig.ColumnModel = new List<ExcelColumnModel>();
197   - List<string> selectKeyList = input.selectKey.Split(',').ToList();
198   - foreach (var item in selectKeyList)
199   - {
200   - var isExist = paramList.Find(p => p.field == item);
201   - if (isExist != null)
202   - {
203   - excelconfig.ColumnModel.Add(new ExcelColumnModel() { Column = isExist.field, ExcelColumn = isExist.value });
204   - }
205   - }
206   - var addPath = FileVariable.TemporaryFilePath + excelconfig.FileName;
207   - ExcelExportHelper<LqMdMdgsListOutput>.Export(exportData, excelconfig, addPath);
208   - var fileName = _userManager.UserId + "|" + addPath + "|xls";
209   - var output = new
210   - {
211   - name = excelconfig.FileName,
212   - url = "/api/File/Download?encryption=" + DESCEncryption.Encrypt(fileName, "NCC")
213   - };
214   - return output;
215   - }
216   -
217   - /// <summary>
218   - /// 批量删除门店归属
219   - /// </summary>
220   - /// <param name="ids">主键数组</param>
221   - /// <returns></returns>
222   - [HttpPost("batchRemove")]
223   - public async Task BatchRemove([FromBody] List<string> ids)
224   - {
225   - var entitys = await _db.Queryable<LqMdMdgsEntity>().In(it => it.Id, ids).ToListAsync();
226   - if (entitys.Count > 0)
227   - {
228   - try
229   - {
230   - //开启事务
231   - _db.BeginTran();
232   - //批量删除门店归属
233   - await _db.Deleteable<LqMdMdgsEntity>().In(d => d.Id,ids).ExecuteCommandAsync();
234   - //关闭事务
235   - _db.CommitTran();
236   - }
237   - catch (Exception)
238   - {
239   - //回滚事务
240   - _db.RollbackTran();
241   - throw NCCException.Oh(ErrorCode.COM1002);
242   - }
243   - }
244   - }
245   -
246   - /// <summary>
247   - /// 更新门店归属
248   - /// </summary>
249   - /// <param name="id">主键</param>
250   - /// <param name="input">参数</param>
251   - /// <returns></returns>
252   - [HttpPut("{id}")]
253   - public async Task Update(string id, [FromBody] LqMdMdgsUpInput input)
254   - {
255   - var entity = input.Adapt<LqMdMdgsEntity>();
256   - var isOk = await _db.Updateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync();
257   - if (!(isOk > 0)) throw NCCException.Oh(ErrorCode.COM1001);
258   - }
259   -
260   - /// <summary>
261   - /// 删除门店归属
262   - /// </summary>
263   - /// <returns></returns>
264   - [HttpDelete("{id}")]
265   - public async Task Delete(string id)
266   - {
267   - var entity = await _db.Queryable<LqMdMdgsEntity>().FirstAsync(p => p.Id == id);
268   - _ = entity ?? throw NCCException.Oh(ErrorCode.COM1005);
269   - var isOk = await _db.Deleteable<LqMdMdgsEntity>().Where(d => d.Id == id).ExecuteCommandAsync();
270   - if (!(isOk > 0)) throw NCCException.Oh(ErrorCode.COM1002);
271   - }
272   - }
273   -}
netcore/src/Modularity/Extend/NCC.Extend/LqMdxxService.cs
... ... @@ -107,6 +107,10 @@ namespace NCC.Extend.LqMdxx
107 107 gsmc=it.Gsmc,
108 108 fr=it.Fr,
109 109 ywsb=it.Ywsb,
  110 + jyb=it.Jyb,
  111 + kjb=it.Kjb,
  112 + dxmb=it.Dxmb,
  113 + syb=it.Syb,
110 114 }).MergeTable().OrderBy(sidx+" "+input.sort).ToPagedListAsync(input.currentPage, input.pageSize);
111 115 return PageResult<LqMdxxListOutput>.SqlSugarPageResult(data);
112 116 }
... ... @@ -261,6 +265,7 @@ namespace NCC.Extend.LqMdxx
261 265 public async Task Update(string id, [FromBody] LqMdxxUpInput input)
262 266 {
263 267 var entity = input.Adapt<LqMdxxEntity>();
  268 + entity.Id = id; // 设置主键ID
264 269 var isOk = await _db.Updateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync();
265 270 if (!(isOk > 0)) throw NCCException.Oh(ErrorCode.COM1001);
266 271 }
... ...
netcore/src/Modularity/Extend/NCC.Extend/OrganizeService.cs 0 → 100644
  1 +using NCC.Common.Entity;
  2 +using NCC.Extend.Entitys.Dto.Organize;
  3 +using NCC.Extend.Interfaces.Organize;
  4 +using NCC.System.Entitys.Permission;
  5 +using NCC.Dependency;
  6 +using NCC.DynamicApiController;
  7 +using Microsoft.AspNetCore.Mvc;
  8 +using SqlSugar;
  9 +using System;
  10 +using System.Collections.Generic;
  11 +using System.Linq;
  12 +using System.Threading.Tasks;
  13 +
  14 +namespace NCC.Extend
  15 +{
  16 + /// <summary>
  17 + /// 组织架构服务实现
  18 + /// </summary>
  19 + [ApiDescriptionSettings(Tag = "绿纤组织架构服务", Name = "Organize", Order = 201)]
  20 + [Route("api/Extend/[controller]")]
  21 + public class OrganizeService : IOrganizeService, IDynamicApiController, ITransient
  22 + {
  23 + private readonly ISqlSugarClient _db;
  24 +
  25 + /// <summary>
  26 + /// 初始化组织架构服务
  27 + /// </summary>
  28 + /// <param name="db">数据库客户端</param>
  29 + public OrganizeService(ISqlSugarClient db)
  30 + {
  31 + _db = db;
  32 + }
  33 +
  34 + #region 组织架构查询
  35 +
  36 + /// <summary>
  37 + /// 获取组织架构列表
  38 + /// </summary>
  39 + /// <param name="input">查询参数</param>
  40 + /// <returns>组织架构列表</returns>
  41 + [HttpGet("")]
  42 + public async Task<dynamic> GetList([FromQuery] OrganizeListQueryInput input)
  43 + {
  44 + var query = _db.Queryable<OrganizeEntity>()
  45 + .WhereIF(!string.IsNullOrEmpty(input.FullName), x => x.FullName.Contains(input.FullName))
  46 + .WhereIF(!string.IsNullOrEmpty(input.EnCode), x => x.EnCode.Contains(input.EnCode))
  47 + .WhereIF(!string.IsNullOrEmpty(input.Category), x => x.Category == input.Category)
  48 + .WhereIF(!string.IsNullOrEmpty(input.ParentId), x => x.ParentId == input.ParentId)
  49 + .WhereIF(input.EnabledMark.HasValue, x => x.EnabledMark == input.EnabledMark)
  50 + .Where(x => x.DeleteMark == null)
  51 + .OrderBy(x => x.SortCode, OrderByType.Asc)
  52 + .OrderBy(x => x.CreatorTime, OrderByType.Desc);
  53 +
  54 + var total = await query.CountAsync();
  55 + var list = await query
  56 + .Select(x => new OrganizeListOutput
  57 + {
  58 + Id = x.Id,
  59 + FullName = x.FullName,
  60 + EnCode = x.EnCode,
  61 + Category = x.Category,
  62 + ParentId = x.ParentId,
  63 + ManagerId = x.ManagerId,
  64 + Description = x.Description,
  65 + SortCode = x.SortCode,
  66 + EnabledMark = x.EnabledMark,
  67 + CreatorTime = x.CreatorTime
  68 + })
  69 + .ToPagedListAsync(input.currentPage, input.pageSize);
  70 +
  71 + // 获取父级组织名称和主管姓名
  72 + var parentIds = list.list.Where(x => !string.IsNullOrEmpty(x.ParentId)).Select(x => x.ParentId).Distinct().ToList();
  73 + var managerIds = list.list.Where(x => !string.IsNullOrEmpty(x.ManagerId)).Select(x => x.ManagerId).Distinct().ToList();
  74 +
  75 + var parentMap = new Dictionary<string, string>();
  76 + var managerMap = new Dictionary<string, string>();
  77 +
  78 + if (parentIds.Any())
  79 + {
  80 + var parents = await _db.Queryable<OrganizeEntity>()
  81 + .Where(x => parentIds.Contains(x.Id))
  82 + .Select(x => new { x.Id, x.FullName })
  83 + .ToListAsync();
  84 + parentMap = parents.ToDictionary(x => x.Id, x => x.FullName);
  85 + }
  86 +
  87 + if (managerIds.Any())
  88 + {
  89 + var managers = await _db.Queryable<UserEntity>()
  90 + .Where(x => managerIds.Contains(x.Id))
  91 + .Select(x => new { x.Id, x.RealName })
  92 + .ToListAsync();
  93 + managerMap = managers.ToDictionary(x => x.Id, x => x.RealName);
  94 + }
  95 +
  96 + // 填充父级组织名称和主管姓名
  97 + foreach (var item in list.list)
  98 + {
  99 + if (!string.IsNullOrEmpty(item.ParentId) && parentMap.ContainsKey(item.ParentId))
  100 + {
  101 + item.ParentName = parentMap[item.ParentId];
  102 + }
  103 +
  104 + if (!string.IsNullOrEmpty(item.ManagerId) && managerMap.ContainsKey(item.ManagerId))
  105 + {
  106 + item.ManagerName = managerMap[item.ManagerId];
  107 + }
  108 +
  109 + // 获取子组织数量
  110 + item.ChildrenCount = await _db.Queryable<OrganizeEntity>()
  111 + .Where(x => x.ParentId == item.Id && x.DeleteMark == null)
  112 + .CountAsync();
  113 + }
  114 +
  115 + return new { list = list.list, total };
  116 + }
  117 +
  118 + /// <summary>
  119 + /// 获取组织架构树形结构
  120 + /// </summary>
  121 + /// <param name="parentId">父级组织ID(可选)</param>
  122 + /// <returns>组织架构树形结构</returns>
  123 + [HttpGet("Tree")]
  124 + public async Task<List<OrganizeTreeOutput>> GetTree([FromQuery] string parentId = null)
  125 + {
  126 + var query = _db.Queryable<OrganizeEntity>()
  127 + .Where(x => x.DeleteMark == null)
  128 + .WhereIF(!string.IsNullOrEmpty(parentId), x => x.ParentId == parentId)
  129 + .WhereIF(string.IsNullOrEmpty(parentId), x => string.IsNullOrEmpty(x.ParentId))
  130 + .OrderBy(x => x.SortCode, OrderByType.Asc)
  131 + .OrderBy(x => x.CreatorTime, OrderByType.Desc);
  132 +
  133 + var list = await query
  134 + .Select(x => new OrganizeTreeOutput
  135 + {
  136 + Id = x.Id,
  137 + FullName = x.FullName,
  138 + EnCode = x.EnCode,
  139 + Category = x.Category,
  140 + ParentId = x.ParentId,
  141 + ManagerId = x.ManagerId,
  142 + Description = x.Description,
  143 + SortCode = x.SortCode,
  144 + EnabledMark = x.EnabledMark
  145 + })
  146 + .ToListAsync();
  147 +
  148 +
  149 + // 构建树形结构
  150 + return BuildTree(list, parentId);
  151 + }
  152 +
  153 + /// <summary>
  154 + /// 根据组织名称获取该机构下面的所有组织
  155 + /// </summary>
  156 + /// <param name="organizeName">组织名称</param>
  157 + /// <returns>组织及其子组织列表</returns>
  158 + [HttpGet("GetByName")]
  159 + public async Task<dynamic> GetOrganizationsByName([FromQuery] string organizeName)
  160 + {
  161 + if (string.IsNullOrEmpty(organizeName))
  162 + {
  163 + throw new ArgumentException("组织名称不能为空", nameof(organizeName));
  164 + }
  165 +
  166 + // 查找匹配的组织
  167 + var matchedOrganizes = await _db.Queryable<OrganizeEntity>().Where(x => x.FullName == organizeName && x.DeleteMark == null).FirstAsync();
  168 + if (matchedOrganizes == null)
  169 + {
  170 + throw new ArgumentException("未找到指定组织", nameof(organizeName));
  171 + }
  172 + var result = await _db.Queryable<OrganizeEntity>().Where(x => x.ParentId == matchedOrganizes.Id && x.DeleteMark == null).Select(x => new OrganizeTreeOutput
  173 + {
  174 + Id = x.Id,
  175 + FullName = x.FullName,
  176 + EnCode = x.EnCode,
  177 + Category = x.Category,
  178 + }).ToListAsync();
  179 + return result;
  180 + }
  181 +
  182 + /// <summary>
  183 + /// 获取组织选择器数据
  184 + /// </summary>
  185 + /// <param name="parentId">父级组织ID(可选)</param>
  186 + /// <returns>组织选择器数据</returns>
  187 + [HttpGet("Selector")]
  188 + public async Task<dynamic> GetSelector([FromQuery] string parentId = null)
  189 + {
  190 + var query = _db.Queryable<OrganizeEntity>()
  191 + .Where(x => x.DeleteMark == null && x.EnabledMark == 1)
  192 + .WhereIF(!string.IsNullOrEmpty(parentId), x => x.ParentId == parentId)
  193 + .WhereIF(string.IsNullOrEmpty(parentId), x => string.IsNullOrEmpty(x.ParentId))
  194 + .OrderBy(x => x.SortCode, OrderByType.Asc)
  195 + .OrderBy(x => x.CreatorTime, OrderByType.Desc);
  196 +
  197 + var list = await query
  198 + .Select(x => new
  199 + {
  200 + id = x.Id,
  201 + fullName = x.FullName,
  202 + enCode = x.EnCode,
  203 + category = x.Category,
  204 + parentId = x.ParentId
  205 + })
  206 + .ToListAsync();
  207 +
  208 + return new { list };
  209 + }
  210 +
  211 + #endregion
  212 +
  213 + #region 私有方法
  214 +
  215 + /// <summary>
  216 + /// 构建树形结构
  217 + /// </summary>
  218 + /// <param name="list">组织列表</param>
  219 + /// <param name="parentId">父级ID</param>
  220 + /// <returns>树形结构</returns>
  221 + private List<OrganizeTreeOutput> BuildTree(List<OrganizeTreeOutput> list, string parentId)
  222 + {
  223 + var result = new List<OrganizeTreeOutput>();
  224 + var parentIdValue = parentId ?? "";
  225 +
  226 + foreach (var item in list.Where(x => x.ParentId == parentIdValue))
  227 + {
  228 + var children = BuildTree(list, item.Id);
  229 + item.Children = children;
  230 + result.Add(item);
  231 + }
  232 +
  233 + return result;
  234 + }
  235 +
  236 + /// <summary>
  237 + /// 获取所有子组织
  238 + /// </summary>
  239 + /// <param name="parentId">父级组织ID</param>
  240 + /// <returns>子组织列表</returns>
  241 + private async Task<List<OrganizeTreeOutput>> GetAllChildren(string parentId)
  242 + {
  243 + var children = await _db.Queryable<OrganizeEntity>()
  244 + .Where(x => x.ParentId == parentId && x.DeleteMark == null)
  245 + .Select(x => new OrganizeTreeOutput
  246 + {
  247 + Id = x.Id,
  248 + FullName = x.FullName,
  249 + EnCode = x.EnCode,
  250 + Category = x.Category,
  251 + ParentId = x.ParentId,
  252 + ManagerId = x.ManagerId,
  253 + Description = x.Description,
  254 + SortCode = x.SortCode,
  255 + EnabledMark = x.EnabledMark
  256 + })
  257 + .ToListAsync();
  258 +
  259 + var allChildren = new List<OrganizeTreeOutput>(children);
  260 +
  261 + foreach (var child in children)
  262 + {
  263 + var grandChildren = await GetAllChildren(child.Id);
  264 + allChildren.AddRange(grandChildren);
  265 + }
  266 +
  267 + return allChildren;
  268 + }
  269 +
  270 + #endregion
  271 + }
  272 +
  273 + /// <summary>
  274 + /// 组织比较器
  275 + /// </summary>
  276 + public class OrganizeComparer : IEqualityComparer<OrganizeTreeOutput>
  277 + {
  278 + /// <summary>
  279 + /// 比较两个组织是否相等
  280 + /// </summary>
  281 + /// <param name="x">组织1</param>
  282 + /// <param name="y">组织2</param>
  283 + /// <returns>是否相等</returns>
  284 + public bool Equals(OrganizeTreeOutput x, OrganizeTreeOutput y)
  285 + {
  286 + return x?.Id == y?.Id;
  287 + }
  288 +
  289 + /// <summary>
  290 + /// 获取组织的哈希码
  291 + /// </summary>
  292 + /// <param name="obj">组织对象</param>
  293 + /// <returns>哈希码</returns>
  294 + public int GetHashCode(OrganizeTreeOutput obj)
  295 + {
  296 + return obj?.Id?.GetHashCode() ?? 0;
  297 + }
  298 + }
  299 +}
... ...
参考资料/.DS_Store
No preview for this file type
参考资料/整体-8.15/.DS_Store
No preview for this file type
数据库说明.md
... ... @@ -26,9 +26,14 @@
26 26 - **业务字段**:使用拼音首字母缩写
27 27 - **时间字段**:统一使用 `datetime` 类型
28 28 - **金额字段**:统一使用 `decimal` 类型
  29 +- **删除标记**:`DeleteMark` 字段为 `null` 表示未删除,为 `0` 或其他值表示已删除
  30 +
  31 +### 重要字段规则
  32 +- **base_organize 表删除标记**:`DeleteMark` 字段为 `null` 表示未删除,为 `0` 或其他值表示已删除
29 33  
30 34 ### 已弃用表
31 35 - **lq_ryzl (人员资料表)** - 已弃用,人员信息现在使用系统用户表 `BASE_USER` 管理
  36 +- **lq_mdxx_mdgs (门店归属表)** - 已弃用,门店归属信息已整合到 `lq_mdxx` 表中
32 37  
33 38 ---
34 39  
... ... @@ -39,27 +44,34 @@
39 44 #### lq_mdxx (门店资料)
40 45 | 字段名 | 数据类型 | 是否可空 | 字段说明 | 主键 |
41 46 |--------|----------|----------|----------|------|
42   -| F_Id | varchar | NO | 主键 | PRI |
43   -| mdbm | varchar | YES | 门店编码 | |
44   -| djmdbh | varchar | YES | 单据门店编号 | |
45   -| djmd | varchar | YES | 单据门店 | |
46   -| dm | varchar | YES | 店名 | |
47   -| cs | varchar | YES | 城市 | |
48   -| dz | varchar | YES | 地址 | |
49   -| xm | varchar | YES | 姓名 | |
50   -| dhhm | varchar | YES | 电话号码 | |
51   -| zj | varchar | YES | 座机 | |
  47 +| F_Id | varchar(50) | NO | 主键 | PRI |
  48 +| mdbm | varchar(50) | YES | 门店编码 | |
  49 +| djmdbh | varchar(50) | YES | 单据门店编号 | |
  50 +| djmd | varchar(50) | YES | 单据门店 | |
  51 +| dm | varchar(50) | YES | 店名 | |
  52 +| cs | varchar(50) | YES | 城市 | |
  53 +| dz | varchar(50) | YES | 地址 | |
  54 +| xm | varchar(50) | YES | 姓名 | |
  55 +| dhhm | varchar(50) | YES | 电话号码 | |
  56 +| zj | varchar(50) | YES | 座机 | |
52 57 | kysj | datetime | YES | 开业时间 | |
53   -| zxzt | varchar | YES | 最新状态 | |
54   -| gsmc | varchar | YES | 工商名称 | |
55   -| fr | varchar | YES | 法人 | |
56   -| ywsb | varchar | YES | 有无社保 | |
  58 +| zxzt | varchar(50) | YES | 最新状态 | |
  59 +| gsmc | varchar(50) | YES | 工商名称 | |
  60 +| fr | varchar(50) | YES | 法人 | |
  61 +| ywsb | varchar(50) | YES | 有无社保 | |
  62 +| syb | varchar(50) | YES | 事业部 | |
  63 +| jyb | varchar(50) | YES | 教育部 | |
  64 +| kjb | varchar(50) | YES | 科技部 | |
  65 +| dxmb | varchar(50) | YES | 大项目部 | |
  66 +| gsqssj | datetime | YES | 归属起始时间 | |
  67 +| gszzsj | datetime | YES | 归属终止时间 | |
  68 +| status | int(11) | YES | 状态 | |
57 69  
58 70 #### lq_md_mdlbjhsxx (门店类别及核算信息)
59 71 - 用于存储门店的分类信息和核算相关配置
60 72  
61   -#### lq_md_mdgs (门店归属)
62   -- 用于存储门店的归属关系
  73 +#### ~~lq_md_mdgs (门店归属)~~ - 已弃用
  74 +- ~~用于存储门店的归属关系~~ - 已整合到 `lq_mdxx` 表中
63 75  
64 76 #### lq_md_mdwy (门店物业)
65 77 - 用于存储门店物业相关信息
... ...