ExpressRepository.php 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2016~2024 https://www.crmeb.com All rights reserved.
  6. // +----------------------------------------------------------------------
  7. // | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
  8. // +----------------------------------------------------------------------
  9. // | Author: CRMEB Team <admin@crmeb.com>
  10. // +----------------------------------------------------------------------
  11. namespace app\common\repositories\store\shipping;
  12. use app\common\repositories\BaseRepository;
  13. use app\common\dao\store\shipping\ExpressDao as dao;
  14. use crmeb\services\CrmebServeServices;
  15. use FormBuilder\Factory\Elm;
  16. use think\exception\ValidateException;
  17. use think\facade\Db;
  18. use think\facade\Route;
  19. /**
  20. * 快递公司
  21. */
  22. class ExpressRepository extends BaseRepository
  23. {
  24. /**
  25. * ExpressRepository constructor.
  26. * @param dao $dao
  27. */
  28. public function __construct(dao $dao)
  29. {
  30. $this->dao = $dao;
  31. }
  32. /**
  33. * 检查指定名称是否已存在
  34. *
  35. * 本函数通过调用DAO层的方法来查询数据库中是否存在指定的名称。这在需要确保数据唯一性或需要进行数据验证的场景下非常有用。
  36. * 例如,在注册新用户时,需要检查用户名是否已被占用;或者在添加新商品时,需要确认商品名是否已存在。
  37. *
  38. * @param string $value 待检查的名称值
  39. * @param int|null $id 如果需要,可以根据特定ID进行排除检查(例如,检查其他用户是否已使用了这个名称,但不包括当前用户自己)
  40. * @return bool 返回true表示名称已存在,返回false表示名称不存在或查询失败
  41. */
  42. public function nameExists(string $value, ?int $id)
  43. {
  44. // 调用DAO层的方法来检查名称字段是否存在指定的值
  45. return $this->dao->merFieldExists('name', $value, null, $id);
  46. }
  47. /**
  48. * 检查指定的代码是否已存在于数据库中。
  49. *
  50. * 此方法通过调用DAO层的相应方法来查询数据库,确定给定的代码值是否已存在于指定的字段中。
  51. * 主要用于数据验证和唯一性检查,以确保新插入的数据不会与现有数据重复。
  52. *
  53. * @param string $value 待检查的代码值。
  54. * @param int|null $id 如果需要,可以根据特定ID限制查询范围。
  55. * @return bool 返回true表示代码已存在,返回false表示代码不存在。
  56. */
  57. public function codeExists(string $value, ?int $id)
  58. {
  59. // 调用DAO层的方法来检查代码是否存在
  60. return $this->dao->merFieldExists('code', $value, null, $id);
  61. }
  62. /**
  63. * 检查字段是否存在
  64. *
  65. * 本函数通过调用DAO对象的merFieldExists方法,来判断给定的值是否在数据库中对应的字段中存在。
  66. * 主要用于验证操作前的数据完整性或唯一性约束,确保操作的有效性和数据的准确性。
  67. *
  68. * @param int $value 需要检查的存在性的字段值
  69. * @return bool 返回字段是否存在,存在返回true,不存在返回false
  70. */
  71. public function fieldExists(int $value)
  72. {
  73. // 调用DAO方法检查字段是否存在
  74. return $this->dao->merFieldExists($this->dao->getPk(), $value);
  75. }
  76. /**
  77. * 根据条件搜索数据并分页返回结果。
  78. *
  79. * 本函数用于根据提供的条件数组$where进行数据搜索,然后按照指定的页码$page和每页数据量$limit进行分页。
  80. * 返回包含数据列表和总条数的数组。
  81. *
  82. * @param array $where 搜索条件数组,包含需要的查询条件。
  83. * @param int $page 当前页码,用于指定从哪一页开始获取数据。
  84. * @param int $limit 每页的数据条数,用于指定每页显示多少条数据。
  85. * @return array 返回包含 'count' 和 'list' 两个元素的数组,'count' 为数据总条数,'list' 为当前页的数据列表。
  86. */
  87. public function search(array $where, int $page, int $limit, $merId = 0)
  88. {
  89. // 构建查询语句,根据$where条件进行搜索,并按照'is_show'降序,'sort'降序,'id'升序进行排序。
  90. $query = $this->dao->search($where)->order('is_show DESC,sort DESC,id ASC');
  91. // 计算满足条件的数据总条数。
  92. $count = $query->count();
  93. // 根据当前页码和每页数据量,从查询结果中获取当前页的数据列表。
  94. $list = $query->page($page, $limit)->select();
  95. if($merId) {
  96. foreach ($list as &$item) {
  97. $item['mer_status'] = 0;
  98. if(in_array($merId, explode(',',$item['open_mer']))) {
  99. $item['mer_status'] = 1;
  100. }
  101. unset($item['open_mer']);
  102. }
  103. }
  104. // 将数据总条数和当前页的数据列表组合成数组返回。
  105. return compact('count', 'list');
  106. }
  107. public function changeMerStatus($id, $merStatus, $merId = 0)
  108. {
  109. $info = $this->dao->get($id);
  110. if(!$info) {
  111. throw new ValidateException('快递公司不存在');
  112. }
  113. $openMerArray = explode(',', $info['open_mer']);
  114. empty($openMerArray[0]) ? $openMerArray = [] : $openMerArray;
  115. if($merStatus) {
  116. if(in_array($merId, $openMerArray)) {
  117. throw new ValidateException('已开启,请勿重复开启');
  118. }
  119. $openMerArray[] = $merId;
  120. $openMerArray = array_unique($openMerArray);
  121. } else {
  122. $key = array_search($merId, $openMerArray);
  123. if($key === false) {
  124. throw new ValidateException('未开启,请勿重复关闭');
  125. }
  126. unset($openMerArray[$key]);
  127. }
  128. $openMer = implode(',', $openMerArray);
  129. $res = $info->save(['open_mer' => $openMer]);
  130. if(!$res) {
  131. throw new ValidateException('修改失败');
  132. }
  133. // 根据ID获取快递公司信息
  134. return true;
  135. }
  136. /**
  137. * 创建或编辑快递公司的表单
  138. *
  139. * 本函数用于生成添加或编辑快递公司时所需的表单界面。
  140. * 通过传入不同的参数,决定是创建新的快递公司还是编辑已有的快递公司。
  141. * 表单包含了快递公司名称、编码、是否显示以及排序等必填字段。
  142. *
  143. * @param int $merId 商家ID,当前未在函数中使用,预留参数
  144. * @param int|null $id 快递公司的ID,如果为null,则表示创建新的快递公司;否则,表示编辑已有的快递公司
  145. * @param array $formData 表单的初始数据,用于填充表单字段
  146. * @return mixed 返回生成的表单对象
  147. */
  148. public function form(int $merId, ?int $id = null, array $formData = [])
  149. {
  150. // 根据$id的值决定生成创建还是更新快递公司的表单URL
  151. $url = is_null($id) ? Route::buildUrl('systemExpressCreate')->build() : Route::buildUrl('systemExpressUpdate', ['id' => $id])->build();
  152. // 创建表单实例,并设置表单的提交URL
  153. $form = Elm::createForm($url);
  154. // 设置表单的验证规则,包括公司名称、编码、是否显示和排序字段
  155. $form->setRule([
  156. Elm::input('name', '公司名称:')->placeholder('请输入快递公司名称')->required(),
  157. Elm::input('code', '公司编码:')->placeholder('请输入快递公司编码')->required(),
  158. Elm::switches('is_show', '是否显示:', 1)->activeValue(1)->inactiveValue(0)->inactiveText('关')->activeText('开'),
  159. Elm::number('sort', '排序:', 0)->precision(0)->max(99999),
  160. ]);
  161. // 根据$id的值设置表单标题,并传入formData初始化表单字段
  162. return $form->setTitle(is_null($id) ? '添加快递公司' : '编辑快递公司')->formData($formData);
  163. }
  164. /**
  165. * 更新表单数据的方法
  166. *
  167. * 本方法用于根据给定的商户ID和表单ID来获取当前表单数据,并准备更新操作。
  168. * 它首先从数据访问对象(DAO)中检索指定ID和商户ID的表单数据,然后将这些数据传递给
  169. * form方法,用于更新表单的显示或处理。
  170. *
  171. * @param int|null $merId 商户ID,用于区分不同商户的数据,如果为null,则表示操作的是全局数据。
  172. * @param int $id 表单的唯一标识ID,用于定位具体的表单数据。
  173. * @return array 返回一个包含表单数据的数组,供更新表单使用。
  174. */
  175. public function updateForm(?int $merId, $id)
  176. {
  177. // 通过DAO获取指定ID和merId的表单数据,并转换为数组形式
  178. // 这里使用$this->dao->get($id, $merId)来获取表单数据,
  179. // 然后使用toArray()方法将其转换为数组,以便在form方法中使用。
  180. return $this->form($merId, $id, $this->dao->get($id, $merId)->toArray());
  181. }
  182. /**
  183. * 切换状态函数
  184. * 本函数用于通过指定的ID和数据集来更新数据库中相应记录的状态。
  185. * 主要应用于需要进行状态切换的场景,如启用/禁用用户、文章等。
  186. *
  187. * @param int $id 需要更新状态的记录的ID
  188. * @param array $data 包含状态更新数据的数据集,通常应包含状态字段
  189. * @return bool 更新操作的结果,成功返回true,失败返回false
  190. */
  191. public function switchStatus($id, $data)
  192. {
  193. // 调用DAO层的update方法,执行状态更新操作
  194. return $this->dao->update($id, $data);
  195. }
  196. /**
  197. * 获取选项数据
  198. *
  199. * 本函数用于查询数据库中所有is_show字段为1的记录,并返回这些记录的name和code字段。
  200. * name字段被作为标签显示,code字段被作为值使用。返回的数据格式为数组,方便后续处理。
  201. *
  202. * @return array 返回一个数组,数组中的每个元素包含label和value属性,分别对应数据库中的name和code字段。
  203. */
  204. public function options($merId = 0)
  205. {
  206. return $this->dao->options($merId, ['is_show' => 1], 'name label,code value');
  207. }
  208. /**
  209. * 从一号通同步数据
  210. * @author Qinii
  211. * @day 7/23/21
  212. */
  213. public function syncExportAll()
  214. {
  215. $services = app()->make(CrmebServeServices::class);
  216. $result = $services->express()->express();
  217. $has = $this->dao->search([])->find();
  218. if (!is_null($has)) {
  219. $arr = [];
  220. foreach ($result['data'] as $datum) {
  221. $res = $this->dao->getWhere(['code' => $datum['code']]);
  222. if ($res) {
  223. $res->name = $datum['name'];
  224. $res->mark = $datum['mark'];
  225. $res->partner_id = $datum['partner_id'];
  226. $res->partner_key = $datum['partner_key'];
  227. $res->partner_name = $datum['partner_name'];
  228. $res->check_man = $datum['check_man'];
  229. $res->is_code = $datum['is_code'];
  230. $res->net = $datum['net'];
  231. $res->save();
  232. } else {
  233. $arr[] = [
  234. 'code' => $datum['code'],
  235. 'name' => $datum['name'],
  236. 'mark' => $datum['mark'],
  237. 'partner_id' => $datum['partner_id'],
  238. 'partner_key' => $datum['partner_key'],
  239. 'partner_name' => $datum['partner_name'],
  240. 'check_man' => $datum['check_man'],
  241. 'is_code' => $datum['is_code'],
  242. 'net' => $datum['net'],
  243. ];
  244. }
  245. }
  246. } else {
  247. $data = $result['data'];
  248. $arr = array_map(function ($datum){
  249. return [
  250. 'code' => $datum['code'],
  251. 'name' => $datum['name'],
  252. 'mark' => $datum['mark'],
  253. 'partner_id' => $datum['partner_id'],
  254. 'partner_key' => $datum['partner_key'],
  255. 'partner_name' => $datum['partner_name'],
  256. 'check_man' => $datum['check_man'],
  257. 'is_code' => $datum['is_code'],
  258. 'net' => $datum['net'],
  259. ];
  260. },$data);
  261. }
  262. $this->dao->insertAll($arr);
  263. }
  264. /**
  265. * 合作伙伴表单生成方法
  266. * 用于根据传递的ID和商家ID生成合作伙伴的编辑表单
  267. * 主要用于编辑月结账号相关信息。
  268. *
  269. * @param int $id 快递公司的ID
  270. * @param int $merId 商家的ID
  271. * @return \EasyWeChat\Kernel\Messages\Form 生成的表单对象
  272. * @throws ValidateException 当数据表中无需要编辑的信息时抛出异常
  273. */
  274. public function partnerForm($id, $merId)
  275. {
  276. // 根据商家ID和快递公司ID构建查询条件
  277. $where = ['mer_id' => $merId, 'express_id' => $id];
  278. // 根据ID获取表单数据
  279. $formData = $this->dao->get($id);
  280. // 判断表单数据中是否包含任何需要编辑的信息,如果没有则抛出异常
  281. if (!$formData['partner_id'] && !$formData['partner_key'] && !$formData['check_man'] && !$formData['partner_name'] && !$formData['is_code'] && !$formData['net'])
  282. throw new ValidateException('无需月结账号');
  283. // 根据查询条件获取合作伙伴的信息
  284. $res = app()->make(ExpressPartnerRepository::class)->getSearch($where)->find();
  285. // 构建表单URL
  286. $form = Elm::createForm(Route::buildUrl('merchantExpressPratnerUpdate', ['id' => $id])->build());
  287. // 根据表单数据中相应的标志位,生成相应的表单字段
  288. if ($formData['partner_id'] == 1)
  289. $field[] = Elm::input('account', '月结账号:', $res['account'] ?? '')->placeholder('请输入月结账号');
  290. if ($formData['partner_key'] == 1)
  291. $field[] = Elm::input('key', '月结密码:', $res['key'] ?? '')->placeholder('请输入月结密码');
  292. if ($formData['net'] == 1)
  293. $field[] = Elm::input('net_name', '取件网点:', $res['net_name'] ?? '')->placeholder('请输入取件网点');
  294. if ($formData['check_man'] == 1)
  295. $field[] = Elm::input('check_man', '承载快递员名称:', $res['check_man'] ?? '')->placeholder('请输入承载快递员名称');
  296. if ($formData['partner_name'] == 1)
  297. $field[] = Elm::input('partner_name', '客户账户名称:', $res['partner_name'] ?? '')->placeholder('请输入客户账户名称');
  298. if ($formData['is_code'] == 1)
  299. $field[] = Elm::input('code', '承载编号:', $res['code'] ?? '')->placeholder('请输入承载编号');
  300. // 添加启用状态的单选框
  301. $field[] = Elm::radio('status', '是否启用:', $res['status'] ?? 1)->options([['value' => 0, 'label' => '隐藏'], ['value' => 1, 'label' => '启用']]);
  302. // 设置表单字段规则
  303. $form->setRule($field);
  304. // 设置表单标题和初始数据
  305. return $form->setTitle('编辑月结账号')->formData($formData->toArray());
  306. }
  307. /**
  308. * 添加月结账号
  309. * @param array $data
  310. * @author Qinii
  311. * @day 7/23/21
  312. */
  313. public function updatePartne(array $data)
  314. {
  315. Db::transaction(function () use ($data) {
  316. $make = app()->make(ExpressPartnerRepository::class);
  317. $where = [
  318. 'express_id' => $data['express_id'],
  319. 'mer_id' => $data['mer_id']
  320. ];
  321. $getData = $make->getSearch($where)->find();
  322. if ($getData) {
  323. $make->update($getData['id'], $data);
  324. } else {
  325. $make->create($data);
  326. }
  327. });
  328. }
  329. }